Pour clarifier le but de cette question : Je sais COMMENT créer des vues complexes avec des sous-vues et en utilisant drawRect. J'essaie de bien comprendre quand et pourquoi utiliser l'une plutôt que l'autre.
Je comprends également que cela n'a pas de sens d'optimiser autant à l'avance, et de faire quelque chose de la manière la plus difficile avant de faire un profilage. Je considère que je suis à l'aise avec les deux méthodes, et que je veux vraiment approfondir mes connaissances.
Une grande partie de ma confusion vient du fait que j'ai appris comment rendre le défilement des vues de tableaux vraiment fluide et rapide. Bien sûr, la source originale de cette méthode provient de l'application auteur derrière twitter pour iPhone (anciennement tweetie). En gros, il est dit que pour rendre le défilement des tableaux plus fluide, le secret est de ne PAS utiliser de sous-vues, mais plutôt de faire tout le dessin dans une uiview personnalisée. Il semble essentiellement que l'utilisation d'un grand nombre de vues secondaires ralentit le rendu parce qu'elles ont beaucoup de frais généraux et sont constamment recomposées par rapport à leurs vues parentes.
Pour être juste, ceci a été écrit quand le 3GS était tout neuf, et les iDevices sont devenus beaucoup plus rapides depuis. Toujours cette méthode es régulièrement Proposition de sur le interwebs et ailleurs pour les tables à haute performance. En fait, c'est une méthode suggérée dans Exemple de code pour la table des pommes a été suggéré dans plusieurs vidéos de la WWDC ( Dessin pratique pour les développeurs iOS ), et beaucoup d'iOS livres de programmation .
Il y a même des outils impressionnants pour concevoir des graphiques et générer du code Core Graphics pour ceux-ci.
Donc, au début, j'ai été amené à croire qu'il y a une raison pour laquelle le Core Graphics existe. C'est RAPIDE !"
Mais dès que je pense avoir compris l'idée "Favoriser le Core Graphics quand c'est possible", je commence à voir que drawRect est souvent responsable de la mauvaise réactivité d'une application, est extrêmement coûteux en mémoire, et taxe vraiment le CPU. En gros, je devrais " Évitez de surcharger drawRect "(WWDC 2012 Performance des applications iOS : Graphiques et animations )
Donc je suppose que, comme tout, c'est compliqué. Peut-être pouvez-vous nous aider, moi et d'autres, à comprendre quand et pourquoi utiliser drawRect ?
Je vois quelques situations évidentes pour utiliser le Core Graphics :
- Vous avez des données dynamiques (exemple du graphique boursier d'Apple)
- Vous avez un élément d'interface utilisateur flexible qui ne peut être exécuté avec une simple image redimensionnable.
- Vous créez un graphique dynamique qui, une fois rendu, est utilisé à plusieurs endroits.
Je vois des situations pour éviter le Core Graphics :
- Les propriétés de votre vue doivent être animées séparément
- Vous avez une hiérarchie de vues relativement petite, donc tout effort supplémentaire perçu en utilisant la CG ne vaut pas le gain.
- Vous voulez mettre à jour des parties de la vue sans redessiner l'ensemble.
- La mise en page de vos vues secondaires doit être mise à jour lorsque la taille de la vue parent change.
Alors donnez votre savoir. Dans quelles situations utilisez-vous drawRect/Core Graphics (qui pourrait aussi être réalisé avec des subviews) ? Quels facteurs vous amènent à cette décision ? Comment/Pourquoi dessiner dans une vue personnalisée est recommandé pour un défilement fluide des cellules d'un tableau, alors qu'Apple déconseille drawRect pour des raisons de performances en général ? Qu'en est-il des images d'arrière-plan simples (quand faut-il les créer avec CG ou utiliser une image png redimensionnable) ?
Une compréhension approfondie de ce sujet n'est peut-être pas nécessaire pour réaliser des applications valables, mais je n'aime pas choisir entre les techniques sans être capable d'expliquer pourquoi. Mon cerveau se met en colère contre moi.
Mise à jour des questions
Merci à tous pour ces informations. Quelques questions de clarification ici :
- Si vous dessinez quelque chose avec des graphiques de base, mais que vous pouvez accomplir la même chose avec UIImageViews et un png pré-rendu, devez-vous toujours choisir cette voie ?
- Une question similaire : Surtout avec des outils qui déchirent comme ça Quand devriez-vous envisager de dessiner les éléments d'interface dans les graphiques de base ? (Probablement lorsque l'affichage de votre élément est variable. Par exemple, un bouton avec 20 variations de couleurs différentes. D'autres cas ?)
- Compte tenu de ce que j'ai compris dans ma réponse ci-dessous, les mêmes gains de performance pour une cellule de tableau pourraient-ils être obtenus en capturant effectivement un instantané bitmap de votre cellule après le rendu de votre UIView complexe, et en l'affichant tout en faisant défiler et en masquant votre vue complexe ? Il est évident que certains éléments devraient être mis au point. C'est juste une idée intéressante que j'ai eue.