2009-05-25 10 views
2

Je suis un débutant complet à XCode, donc j'ai gravi la courbe d'apprentissage Quartz2D. Je comprends que la méthode drawRect d'une vue est appelée chaque fois qu'une actualisation des graphiques de la vue est nécessaire, et que la méthode setNeedsDisplay active un redessin. Mais ce que je ne peux pas trouver est une explication claire de la relation entre le contexte graphique et une vue spécifique. Le contexte graphique lui-même n'est apparemment pas une variable d'instance de la vue, donc si je veux modifier une vue, et que je crée un chemin complexe en utilisant les méthodes CGContext ..., quel code est nécessaire pour marier ce contexte graphique à la vue souhaite modifier?Comment connecter une vue au contexte graphique?

Merci d'avance pour toute indication sur cette question.

jrdoner

+0

Xcode est l'IDE, il n'a rien à voir avec les cadres que vous utilisez, vous pouvez monter le Courbe d'apprentissage 2D Quartz en utilisant vim/emacs et faire si vous voulez (même si courir sur l'appareil serait difficile) –

+0

Il serait probablement utile si vous pouviez préciser si cette question est ciblée sur Cocoa (Mac) ou Cocoa Touch (iPhone –

Répondre

3

Vous pouvez créer un contexte graphique, mais qui est nécessaire que dans le dessin complexe operation.For la plupart des cas, il est fait pour vous. Vous avez juste besoin d'obtenir le contexte en appelant UIGraphicsGetCurrentContext(). Lorsque l'infrastructure détermine qu'une vue doit être redessinée (pour diverses raisons, dont l'une est celle que vous avez indiquée en appelant setNeedsDisplay:), elle génère (ou restaure) un contexte graphique pour cette vue et en fait le courant. contexte avant d'appeler -drawRect:. Votre travail consiste ensuite à dessiner dans le contexte qui vous a été fourni. Ensuite, c'est le problème du framework de découper le contexte qui en résulte, de le fusionner avec d'autres contextes et enfin de le dessiner dans la mémoire de l'écran.

Faites un peu attention à faire un dessin trop complexe dans -drawRect: si vous pouvez l'aider. L'iPhone n'a pas un processeur aussi puissant qu'un ordinateur de bureau, et il est recommandé de faire la plus grande partie de votre travail de dessin en utilisant des images plutôt que des chemins. Apple a même supprimé de Mac un grand nombre des wrappers de dessin les plus pratiques, dissuadant presque intentionnellement les développeurs d'utiliser Core Graphics.

+0

Bonne réponse Btw, ce que vous dites de faire dessin complexe dans drawRect: c'est très intéressant, et j'aimerais en lire plus. Connaissez-vous une documentation Apple officielle (ou toute autre discussion) sur le fait de préférer le chargement d'images sur le dessin programmatique? – erikprice

+0

Pour le suivi, est-ce que l'écriture de contenu dessiné par programme dans un CGLayer (plutôt que de redessiner à plusieurs reprises dans drawRect:) serait une alternative acceptable au chargement et à la manipulation d'images? – erikprice

+0

En ce qui concerne les recommandations d'Apple, celles-ci sont extraites de mes notes de la WWDC, où elles ont expliqué pourquoi elles voulaient des images étirées avec des majuscules ou des dégradés sur les boutons. Il ne semble pas y avoir de "Directives de performance de dessin" pour iPhone là-bas il y a pour Mac. Bien que mes notes proviennent de sessions de 2008, je recommande la session # WWDC 2009 (iPhone Views and Animations) si vous avez accès. En ce qui concerne GCLayer par rapport à drawRect :, le fait est que CGGradient et CGPath sont coûteux en ressources CPU, ce qui signifie une batterie coûteuse. Nous devrions donc les éviter lorsque cela est possible. Ils ne sont pas interdits bien sûr: D –

1

Je suppose que vous créez votre chemin dans la méthode -(void)drawRect:(CGRect)rect de votre sous-classe UIView.

intérieur drawRect vous pouvez accéder au contexte graphique en appelant (CGContextRef)UIGraphicsGetCurrentContext(void);

Exemple from lecture 5 cs193p.

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [[UIColor grayColor] set]; 
    UIRectFill ([self bounds]); 
    CGContextBeginPath (context); 
    CGContextMoveToPoint (context, 75, 10); 
    CGContextAddLineToPoint (context, 10, 150); 
    CGContextAddLineToPoint (context, 160, 150); 
    CGContextClosePath (context); 
    [[UIColor redColor] setFill]; 
    [[UIColor blackColor] setStroke]; 
    CGContextDrawPath (context, kCGPathFillStroke); 
} 
Questions connexes