Pour clarifier le but de cette question: Je sais COMMENT créer des vues compliquées avec les deux sous-vues et en utilisant drawRect. J'essaie de bien comprendre le quand et le pourquoi d'utiliser l'un sur l'autre.
Je comprends également qu'il n'est pas logique d'optimiser autant à l'avance et de faire quelque chose de plus difficile avant de faire un profilage. Considérez que je suis à l'aise avec les deux méthodes et que maintenant je veux vraiment une compréhension plus profonde.
Une grande partie de ma confusion vient de l'apprentissage de la façon de rendre les performances de défilement des vues de table vraiment fluides et rapides. Bien sûr, la source originale de cette méthode provient de l' auteur derrière Twitter pour iPhone (anciennement tweetie). Fondamentalement, cela dit que pour rendre le défilement du tableau fluide, le secret est de NE PAS utiliser de sous-vues, mais de faire tout le dessin dans une seule vue personnalisée. Essentiellement, il semble que l'utilisation de nombreuses sous-vues ralentit le rendu car elles ont beaucoup de surcharge et sont constamment recomposées sur leurs vues parentes.
Pour être honnête, cela a été écrit lorsque le 3GS était assez nouveau et que les iDevices sont devenus beaucoup plus rapides depuis. Pourtant cette méthode est régulièrement suggérée sur les interwebs et ailleurs pour les tables hautes performances. En fait, c'est une méthode suggérée dans l'exemple de code de table d'Apple , a été suggérée dans plusieurs vidéos de la WWDC ( Practical Drawing for iOS Developers ) et dans de nombreux livres de programmation iOS .
Il existe même des outils géniaux pour concevoir des graphiques et générer du code Core Graphics pour eux.
Donc, au début, je suis amené à croire "il y a une raison pour laquelle Core Graphics existe. C'est RAPIDE!"
Mais dès que je pense avoir l'idée "Favoriser les graphiques de base lorsque c'est possible", je commence à voir que drawRect est souvent responsable d'une mauvaise réactivité dans une application, est extrêmement coûteux en termes de mémoire et impose vraiment le CPU. Fondamentalement, je devrais " éviter de surcharger drawRect " ( Performance de l'application iOS WWDC 2012 : graphiques et animations )
Donc je suppose que, comme tout, c'est compliqué. Peut-être que vous pouvez m'aider moi-même et aider les autres à comprendre quand et pourquoi utiliser drawRect?
Je vois quelques situations évidentes pour utiliser Core Graphics:
- Vous avez des données dynamiques (exemple de graphique boursier d'Apple)
- Vous avez un élément d'interface utilisateur flexible qui ne peut pas ê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 les graphiques de base:
- 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 CG ne vaut pas le gain
- Vous souhaitez mettre à jour des éléments de la vue sans redessiner le tout
- La mise en page de vos sous-vues doit être mise à jour lorsque la taille de la vue parent change
Alors donnez vos connaissances. Dans quelles situations atteignez-vous pour drawRect / Core Graphics (qui pourrait également être accompli avec des sous-vues)? Quels facteurs vous ont conduit à cette décision? Comment / pourquoi le dessin dans une vue personnalisée est-il recommandé pour un défilement fluide des cellules de 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 les créez-vous avec CG vs en utilisant une image png redimensionnable)?
Une compréhension approfondie de ce sujet n'est peut-être pas nécessaire pour créer des applications intéressantes, mais je n'aime pas choisir entre les techniques sans pouvoir expliquer pourquoi. Mon cerveau se fâche contre moi.
Mise à jour de la question
Merci pour l'information à tous. 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, devriez-vous toujours emprunter cette voie?
- Une question similaire: Surtout avec des outils badass comme celui-ci , quand devriez-vous envisager de dessiner des é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 ma compréhension dans ma réponse ci-dessous, les mêmes gains de performances pour une cellule de tableau pourraient-ils être obtenus en capturant efficacement un instantané bitmap de votre cellule après le rendu UIView complexe lui-même, et en l'affichant tout en faisant défiler et en masquant votre vue complexe? De toute évidence, certaines pièces devraient être élaborées. Juste une pensée intéressante que j'avais.