2009-11-02 12 views
46

J'ai un UIImage que je veux dessiner sur un UIView. Mais au lieu de créer un UIImageView et en ajoutant cela comme sous-vue, je veux écraser -drawRect: et dessiner mon UIView directement.Comment dessiner un UIImage ou directement dans -drawRect :?

Par exemple, mon code ressemble:

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

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

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

Répondre

83

Appel [img drawInRect:rect];.

+4

Il y a aussi '[img drawAtPoint: point]', bien que je préfère 'drawInRect:'. –

+0

essayez d'éviter cette technique si vous le pouvez; drawInRect et drawAtPoint ont des performances assez terribles. – TomSwift

+1

Merci. J'ai trouvé ceux-ci particulièrement utiles (combinés avec les modules complémentaires de dessin NSString UIKit) pour les vues qui contiennent des images d'arrière-plan et du texte, puis ajoutées à la vue déroulante. Dessiner l'image de fond et le texte ensemble dans drawRect: évite à Quartz de mélanger les couches (comme ce serait le cas si vous utilisiez l'approche des sous-vues UIImageView & UILabel) qui a un impact significatif sur les performances de défilement – cidered

30

BTW, vous ne devez pas charger le fichier image dans la méthode drawRect. Parce que la méthode est appelée chaque fois que la vue doit être mise à jour. Par conséquent, il (bien sûr, la procédure de chargement) peut être appelé de nombreuses fois pendant l'exécution. (En outre, la méthode imageNamed OS2.x a un bogue - pas mis en cache l'image et fuite il.)

Par conséquent, vous feriez mieux de charger le fichier dans la méthode d'initialisation, pas dans le drawRect.

+0

Merci pour cette information utile. Malheureusement, quelle méthode d '"initialisation" voulez-vous dire? – geforce

+0

Il signifie probablement '+ (void) initialize', ou la méthode habituelle' init', selon ce que vous faites. – Mason