2010-04-12 8 views
0

Je sais que le CGContext ne peut pas l'appeler pour dessiner directement, et il doit remplir la logique de dessin dans drawInContext, et appeler le CGContext pour dessiner en utilisant "setNeedsDisplay", donc, j'ai conçu un cmd à exécuter, mais ça problèmes ... comme ceci:Quelle est la meilleure façon d'utiliser CGContext pour dessiner?

Why I can't draw in a loop? (Using UIView in iPhone)

Je pense que la CGContext est très différent de ma précédente expérience de programmation .... (je toile HTML5, qui me permet d'ajouter plus de détails, après que je dessine, donc faire le Java Swing) En fait, je veux savoir ce qui est approprié pour mettre en œuvre ce genre de chose dans l'esprit programmeur d'Apple. Thz.

Répondre

6

Il y a trois approches à ce que vous demandez. Vous pouvez dessiner tout en drawRect:, vous pouvez gérer plusieurs calques ou dessiner une image. Chacun a des avantages, mais vous devez d'abord penser correctement au problème afin de ne pas détruire les performances.

Le dessin se produit constamment. Chaque fois que quelque chose change, il peut y avoir beaucoup de dessin à faire. Pas tout l'écran en général, mais encore beaucoup de dessin. Depuis drawRect: et drawInContext: peuvent être appelés plusieurs fois, ils doivent être efficaces. Cela signifie que vous ne voulez pas faire beaucoup de calculs coûteux, et vous ne voulez pas faire beaucoup de dessin inutile. "Inutile" signifie "ne sera pas réellement affiché parce qu'il est hors écran ou obscurci par un autre dessin". Donc, dans le cas habituel, vous mettez votre code de dessin réel au drawRect:, mais vous faites tous vos calculs ailleurs, généralement lorsque vos données changent. Par exemple, vous lisez vos fichiers, calculez vos coordonnées, créez des CGPaths, etc. à chaque fois que vos données changent (ce qui devrait être beaucoup moins fréquent que de dessiner). Vous enregistrez tous les résultats dans ivars, puis dans drawRect: vous venez de dessiner le résultat final. Donc dans votre exemple de boucle, vous auriez probablement un NSArray d'images dans votre objet de vue, et dans drawRect: vous les dessineriez tous dans l'ordre.

Une autre approche consiste à créer une couche distincte pour chaque image, à définir l'image en tant que contenu, puis à lier la couche à la vue. Vous avez terminé à ce moment-là. Il n'y a plus de code de dessin à écrire. Le quartz gère les couches très efficacement, ce qui peut être une très bonne solution à une grande variété de problèmes.

Enfin, vous pouvez tout regrouper dans une image, puis coller cette image dans une vue d'image ou dessiner l'image directement dans la vue ou l'associer à un calque. C'est une bonne solution si vous avez un dessin très compliqué (en particulier en utilisant CGPath). Cela peut être coûteux si vous modifiez constamment des choses, car vous devez créer un nouveau contexte d'image, dessiner l'ancienne image dans le nouveau contexte, dessiner dessus, puis créer une nouvelle image à partir du contexte. Mais c'est bon pour un dessin compliqué qui ne change pas souvent.

Mais vous avez raison, CGContext n'est pas comme une toile. Il doit être redessiné à chaque cycle de tirage. Vous pouvez le faire vous-même, ou vous pouvez utiliser un autre objet de vue (comme UIImageView) pour le faire pour vous. Mais cela doit être fait d'une manière ou d'une autre.

+0

Je n'ai pas eu l'idée de CGContext, pourquoi Apple ne met-il pas en place un canevas à la place, je pense que c'est beaucoup plus facile à suivre. Mon cas est que je vais utiliser le CGContext pour faire des animations, pensez-vous que la couche multiple est approprié pour moi? – Tattat

+0

Pour le cas où vous décrivez où vous composez diverses images, plusieurs couches est probablement une bonne approche. Les animations sont très efficaces avec les calques. –

+0

+1 Bon résumé des différentes techniques – manifest