2009-11-02 15 views
46

Ho un UIImage che voglio disegnare su un UIView. Ma invece di creare un UIImageView e aggiungerlo come sottoview, voglio sovrascrivere -drawRect: e disegnare direttamente il mio UIView.Come disegnare un UIImage o direttamente in -drawRect :?

Per esempio, il mio codice è simile:

- (void)drawRect:(CGRect)rect { 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 

    UIImage *img = [UIImage imageNamed:@"foo.png"]; 

    // how to draw the directly into the view now? 
} 

risposta

83

chiamata [img drawInRect:rect];.

+4

C'è anche '[img drawAtPoint: point]', anche se preferisco 'drawInRect:'. –

+0

cerca di evitare questa tecnica se puoi; drawInRect e drawAtPoint hanno prestazioni piuttosto terribili. – TomSwift

+1

Grazie. Ho trovato questi particolarmente utili (in combinazione con i simili componenti aggiuntivi di disegno NSString UIKit) per le viste che contengono immagini di sfondo e testo e quindi aggiunti alla vista di scorrimento. Disegnare l'immagine di sfondo e il testo insieme in drawRect: evita che Quartz si unisca ai livelli (come farebbe se si utilizzasse l'approccio di sottoview UIImageView e UILabel) che ha un impatto significativo sulle prestazioni di scorrimento – cidered

30

BTW, non è necessario caricare il file di immagine nel metodo drawRect. Perché il metodo viene chiamato ogni volta che è necessario aggiornare la vista. Pertanto, (ovviamente, la procedura di caricamento) può essere chiamata molte volte durante l'esecuzione. (Inoltre, il metodo imageNamed di OS2.x ha un bug - non memorizzato nella cache dell'immagine e trapelato.)

Pertanto, è preferibile caricare il file nel metodo di inizializzazione, non in drawRect.

+0

Grazie per le utili informazioni. Sfortunatamente, quale metodo di "inizializzazione" intendi? – geforce

+0

Probabilmente significa '+ (void) initialize', o il solito metodo' init', a seconda di cosa stai facendo. – Mason