Des astuces pour améliorer les performances de défilement de UITableView pour iPhone?

J’ai une vue unique qui charge des images assez grandes dans chaque cellule et la hauteur des cellules varie en fonction de la taille de l’image. Les performances de défilement sont décentes, mais peuvent parfois être saccadées.

J’ai trouvé ces astuces que j’ai trouvées sur le blog FieryRobot:

défilement vitreux avec vue-modifiable

défilement plus vitreux

Quelqu’un a-t-il des conseils pour améliorer les performances du défilement des vues?

  1. Mettre en cache la hauteur des lignes (la vue de table peut le demander fréquemment)
  2. Créer un cache récemment utilisé pour les images utilisées dans la table (et invalider toutes les entrées inactives lorsque vous recevez un avertissement de mémoire)
  3. Dessinez tout dans le UITableViewCell de drawRect: si possible les sous-vues à tout prix (ou si vous avez besoin de la fonctionnalité d’accessibilité standard, drawRect: la vue de contenu drawRect:
  4. Rendre opaque la couche de votre UITableViewCell (même chose pour la vue du contenu si vous en avez une)
  5. Utilisez la fonctionnalité UITableView comme recommandé par les exemples / documentation UITableView
  6. Évitez les dégradés / effets graphiques complexes qui ne sont pas précuits dans UIImage s
  1. Si vous sous-classe UITableViewCell , n’utilisez pas de Nib, écrivez-le plutôt dans le code. C’est beaucoup plus rapide que de charger des fichiers Nib.
  2. Si vous utilisez des images, assurez-vous de les mettre en cache afin de ne pas avoir à charger plus d’une fois à partir d’un fichier (si vous en avez la mémoire, vous seriez surpris du volume des images spatiales).
  3. Rendre autant d’éléments opaques que possible. De même, n’essayez pas et utilisez des images transparentes.

Le développeur derrière Tweetie a beaucoup écrit à ce sujet et dispose d’un code qui montre comment cela a été fait pour cette application. Fondamentalement, il préconise une vue personnalisée par cellule de tableau et la dessine manuellement (plutôt que de sous-visionner avec Interface Builder, entre autres options).

défilement rapide dans tweetie-with-uitableview

En outre, Apple a mis à jour son propre code exemple pour TableView dans ses didacticiels TableViewSuite (peut-être en réponse à cela?)

TableViewSuite

# 1 performance killer pour UITableView scrolling dessine des ombres sur n’importe quel calque de vue de cellule, donc si le défilement des performances est important, ne faites pas d’ombre à moins que cela ne ralentisse votre thread principal.

pensait que cela devait être dit car aucune des réponses acceptées ne mentionnait les ombres et les calques. : +)

Tout problème UITableView performances de défilement UITableView peut être résolu à l’aide de techniques déjà décrites dans d’autres réponses. Cependant, bien souvent, les performances médiocres sont causées par quelque chose de fondamentalement erroné ou de répétitif.

Le fait que UITableView réutilise les cellules et le fait que chaque cellule puisse avoir besoin de sa propre image rend ensemble la solution complexe. De la façon dont le problème est résolu de manière générale, je résume ici les points à prendre en compte:

  1. Charger les données dans la source de données – à partir de REST / firebase database. Cette étape doit être effectuée en arrière-plan, en utilisant éventuellement dispatch_async avec la queue GCD.
  2. Créer et initialiser des objects de modèle de données pertinents et les placer dans un tableau
  3. [tableView reloaddata]
  4. Dans cellForRowAtIndexPath , incluez le code qui définira les données (texte) à partir de l’object de modèle de données correct du tableau.
  5. Maintenant, les images sont peut-être aussi sous la forme d’URL, de sorte que cette étape est peut-être un peu étrange en raison de la réutilisation des cellules effectuée par la vue table. Le cœur du problème est de charger à nouveau l’image du cache / URL du périphérique en utilisant la queue asynchrone, puis de la définir pour corriger cell.image (quelle que soit la propriété de votre image de cellule).

Pour éviter les problèmes, reportez-vous à ce tutoriel sur le chargement paresseux des images dans la vue de la table.