web-dev-qa-db-fra.com

Astuces pour améliorer les performances de défilement de l'iPhone UITableView?

J'ai une vue modifiable 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 correctes, mais peuvent parfois être saccadées.

J'ai trouvé ces conseils que j'ai trouvés sur le blog FieryRobot:

glassy-scrolling-with-uitableview

défilement plus vitreux avec vue modifiable

Quelqu'un a-t-il des conseils pour améliorer les performances de défilement uitableview?

89
Jonah
  1. Mettre en cache la hauteur des lignes (la vue tabulaire peut le demander fréquemment)
  2. Créez un cache le moins récemment utilisé pour les images utilisées dans le tableau (et invalidez toutes les entrées inactives lorsque vous recevez un avertissement de mémoire)
  3. Dessinez tout dans le UITableViewCelldrawRect: si possible, évitez les sous-vues à tout prix (ou si vous avez besoin de la fonctionnalité d'accessibilité standard, la vue de contenu drawRect:)
  4. Rendre le calque de votre UITableViewCell opaque (il en va de même pour la vue du contenu si vous en avez un)
  5. Utilisez la fonctionnalité reusableCellIdentifier comme recommandé par les exemples/documentation UITableView
  6. Évitez les dégradés/effets graphiques compliqués qui ne sont pas précuits dans UIImages
154
rpetrich
  1. Si vous sous-classez UITableViewCell, n'utilisez pas de Nib, écrivez-le à la place 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 à partir du fichier plus d'une fois pour chacune (si vous avez de la mémoire - vous seriez surpris de voir combien d'espace les images occupent).
  3. Rendre autant d'éléments opaques que possible. De même, n'essayez pas et utilisez des images transparentes.
40
Shaggy Frog

Le développeur derrière Tweetie a beaucoup écrit à ce sujet et a du 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-visualiser avec Interface Builder, entre autres options).

défilement rapide en tweetie-avec-uitableview

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

TableViewSuite

34
beno

Le tueur de performances n ° 1 pour le défilement UITableView dessine des ombres sur n'importe quelle couche de vue de cellule, donc si les performances de défilement sont importantes, ne faites pas d'ombres à moins que cela ne ralentisse pas votre thread principal.

pensait que cela devait être dit car aucune des réponses acceptées ne faisait mention d'ombres et de calques. : +)

1
believesInSanta

Tout problème avec les performances de défilement UITableView peut être résolu en utilisant des techniques déjà décrites dans d'autres réponses. Cependant, les performances souvent lentes sont causées par quelque chose de intrinsèquement erroné ou répétitif.

Le fait que UITableView réutilise les cellules, et le fait que chaque cellule peut avoir besoin de sa propre image - ensemble rend le bit de solution complexe. De la façon dont cela est résolu de manière générale, je résume ici les choses qui devraient être prises en charge:

  1. Charger des données dans la source de données - depuis REST/base de données. Cette étape doit être effectuée en arrière-plan, en utilisant éventuellement dispatch_async avec la file d'attente GCD.
  2. Créer et initialiser des objets de modèle de données pertinents et les placer dans un tableau
  3. [tableView reloaddata]
  4. Dans cellForRowAtIndexPath, incluez du code qui définira les données (texte) à partir de l'objet de modèle de données correct du tableau.
  5. Maintenant, les images peuvent également être sous forme d'URL, donc cette étape peut être peu excentrique en raison de la réutilisation des cellules effectuée par la vue de table. Le cœur du fait est de charger à nouveau l'image à partir du cache/URL de l'appareil à l'aide de la file d'attente asynchrone, puis de la définir pour corriger cell.image (quelle que soit la propriété de votre image cellulaire).

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

0
Nirav Bhatt