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?
5 réponses
- Cache la hauteur des lignes (la vue de la table peut le demander fréquemment)
- 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)
- dessinez tout dans les
UITableViewCell
dedrawRect:
si possible évitez les sous-vues à tout prix (ou si vous avez besoin de la fonctionnalité d'accessibilité standard, de la vue de contenudrawRect:
) - rend le calque de votre
UITableViewCell
opaque (il en va de même pour la vue de contenu si vous avoir un) - Utilisez la fonctionnalité reusableCellIdentifier comme recommandé par
UITableView
examples / documentation - évitez les dégradés / effets graphiques compliqués qui ne sont pas précuits dans
UIImage
s
- 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. - 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).
- Rendre autant d'éléments opaques que possible. De même, essayez de ne pas et à l'utilisation images avec transparence.
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).
# 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. :+)
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:
- 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.
- Créez et initialisez des objets de modèle de données pertinents et placez-les dans un tableau
[tableView reloaddata]
- à 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. - 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.