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

J'ai un uitableview qui charge des images assez grandes dans chaque cellule et les hauteurs de cellule varient 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 conseils que j'ai trouvés sur le blog FieryRobot:

Vitreux de défilement-avec-uitableview

Plus-vitreux-défilement-avec-uitableview

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

88
demandé sur NANNAV 2009-08-30 01:51:04

5 réponses

  1. Cache la hauteur des lignes (la vue de la table peut le demander fréquemment)
  2. Créez un cache le moins utilisé récemment pour les images utilisées dans la table (et invalidez toutes les entrées inactives lorsque vous recevez un avertissement de mémoire)
  3. dessinez tout dans les UITableViewCell de drawRect: si possible évitez les sous-vues à tout prix (ou si vous avez besoin de la fonctionnalité d'accessibilité standard, de la vue de contenu drawRect:)
  4. rend le calque de votre UITableViewCell opaque (il en va de même pour la vue de contenu si vous avoir un)
  5. Utilisez la fonctionnalité reusableCellIdentifier comme recommandé par UITableView examples / documentation
  6. évitez les dégradés / effets graphiques compliqués qui ne sont pas précuits dans UIImage s
152
répondu rpetrich 2009-08-29 22:57:59
  1. Si vous sous-classez UITableViewCell, n'utilisez pas de plume, l'écrire dans le code à la place. C'est beaucoup plus rapide que le chargement des fichiers Nib.
  2. Si vous utilisez des images, assurez-vous vous les mettez en cache pour ne pas le faire avoir à charger à partir du fichier plus de une fois pour chacun (si vous avez le mémoire -- vous seriez surpris de voir combien beaucoup d'images de l'espace prennent).
  3. Rendre autant d'éléments opaques que possible. De même, essayez de ne pas et à l'utilisation images avec transparence.
40
répondu Shaggy Frog 2009-08-29 22:11:20

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

Je ne peux pas faire de commentaire.]}

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

TableViewSuite

34
répondu beno 2013-06-14 11:53:09

# 1 Performance killer 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 sauf si cela ne ralentit pas votre thread principal.

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

1
répondu believesInSanta 2014-06-27 06:09:42

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, plusieurs fois la performance lente est causée par quelque chose d'intrinsèquement erroné, ou répétitif.

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

  1. charger les données dans source de données - à partir de 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éez et initialisez des objets de modèle de données pertinents et placez-les dans un tableau
  3. [tableView reloaddata]
  4. à l'intérieur de cellForRowAtIndexPath, incluez le code qui définira les données (texte) de l'objet de modèle de données correct du tableau.
  5. Maintenant, les images peuvent aussi être sous la forme D'URL, donc cette étape peut être peu excentrique à cause de la réutilisation des cellules effectuée par la vue de la table. Le cœur de la le fait est de charger une fois de plus l'image à partir du cache / URL du périphérique en utilisant la file d'attente asynchrone, puis définissez-la sur la cellule correcte.image (quelle que soit la propriété de votre image de cellule).

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

0
répondu Nirav Bhatt 2016-01-16 13:23:23