2009-08-29 12 views
87

J'ai une vue uitable qui charge des images assez grandes dans chaque cellule et les hauteurs de cellule varient en fonction de la taille de l'image. La performance de défilement est décente, mais peut parfois être saccadée.Astuces pour améliorer les performances de défilement de l'iPhone UITableView?

Je trouve ces conseils que j'ai trouvé sur le blog de FieryRobot:

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

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

+0

Si vous avez besoin de mettre en cache les hauteurs de cellules (ce qui peut être coûteux à calculer et est également utilisé fréquemment), j'ai donné un exemple. Utilisez-le uniquement s'il convient à votre application. http://stackoverflow.com/questions/1371223/how-do-i-cache-something-for-a-tableview/10992748#10992748 –

Répondre

151
  1. Cache la hauteur des lignes (la vue de la table peut demander cette fréquemment)
  2. Créer un cache utilisé moins récemment pour les images utilisées dans le tableau (et annuler toutes les entrées inactives lorsque vous recevoir un avertissement de mémoire)
  3. Dessiner tout dans le UITableViewCell « drawRect: s si possible, éviter subviews à tout prix (ou si vous avez besoin de la fonctionnalité d'accessibilité standard, l'affichage du contenu de drawRect:)
  4. Faites vos UITableViewCell » couche s opaque (sa me va pour l'affichage du contenu si vous en avez un)
  5. Utilisez la fonctionnalité de reusableCellIdentifier comme recommandé par le UITableView examples/documentation
  6. Évitez les gradients/effets graphiques complexes qui ne sont pas précuites dans UIImage s
+4

En outre, les images téléchargées doivent être réduites à la taille de l'imageView avant d'afficher sur la cellule! –

+3

Je voudrais ajouter à cette réponse une de mes expériences de ces dernières années - avoir des cellules transparentes n'est probablement jamais la cause de mauvaises performances de défilement. Nous avons une application avec des cellules très compliquées (plus de 20 sous-vues) et tout est transparent pour montrer l'arrière-plan. Avec des optimisations appropriées, la transparence ne fait aucune différence même sur un 3GS. En fait, la chose qui ralentissait le plus était le chargement de la plume avant qu'il y ait assez de cellules pour la retirer de la vue de la table. Si vous utilisez des sous-vues, assurez-vous d'avoir des hiérarchies efficaces et vous n'avez pas besoin d'utiliser drawRect. – Accatyyc

+0

@Accatyyc, il semble que j'ai le même problème. Il y a un léger décalage quand il n'y a pas assez de cellules à défaire, quand 3-4 cellules sont retirées puis le défilement est lisse.Existe-t-il un moyen de précharger les cellules afin qu'il y ait des cellules à déquiler et à ne pas charger les fichiers NIB lors du défilement? – Tiois

40
  1. Si vous UITableViewCell sous-classement, ne pas utiliser un Nib, é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 mettre en cache afin que vous ne devez charger un fichier plus une fois pour chaque (si vous avez la mémoire - vous seriez surpris de voir comment beaucoup d'images spatiales prennent).
  3. Rendre possible autant d'éléments opaques que . De même, essayez de ne pas utiliser les images avec la transparence.
+0

Deux votes négatifs? Ooookay ... –

+3

ne vous inquiétez pas ... qui étaient des trolls. très bonne réponse! – Steav

+0

merci pour le conseil de mise en cache de l'image – pepsi

33

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/elle préconise une vue personnalisée par cellule de tableau, et le dessin manuellement (plutôt que sous-visualisation avec Interface Builder, entre autres options).

fast-scrolling-in-tweetie-with-uitableview

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

TableViewSuite

+1

C'est une solution géniale. Je suis juste curieux comment pourrais-je ajouter un UIButton dans la cellule? Est-ce que c'est dessiné dans la méthode drawRect? –

+1

@beno, votre lien semble brisé (le premier) une chance de mettre la main sur l'article original? – apouche

+2

L'article original peut être lu ici: http://web.archive.org/web/20100922230053/http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ – jverdi

1

# 1 tueur de performance 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 votre thread principal.

pensé que cela devait être dit car aucune des réponses acceptées fait mention des ombres et des couches. : +)

+3

si les problèmes sont les ombres ajouter ces deux lignes de code et tout fonctionne parfaitement self.layer.shouldRasterize = YES; Self12layer.rasterizationScale = UIScreen.mainScreen.scale; –

0

Tout problème lié aux performances de défilement UITableView peut être résolu à l'aide des techniques déjà décrites dans d'autres réponses. Cependant, une performance léthargique est parfois 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 puisse avoir besoin de sa propre image - ensemble rend le bit de la solution 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 la 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éer et initialiser les objets du modèle de données pertinentes et de les mettre dans un tableau
  3. [tableView reloaddata]
  4. intérieur cellForRowAtIndexPath, comprennent le code qui ensemble de données (texte) de l'objet de modèle de données correct du tableau.
  5. Maintenant, les images peuvent aussi prendre la forme d'une URL, donc cette étape peut être un peu bizarre à cause de la réutilisation de cellules effectuée par une 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 de cellule).

Pour éviter les problèmes, reportez-vous à ce didacticiel à propos de lazy loading of images à l'intérieur de la vue de table.

Questions connexes