2010-04-07 6 views
5

Ce n'est pas vraiment une question parce que je viens de résoudre le problème, mais je pense que la nature du problème est commun pour beaucoup de développeurs iPhone et la solution n'a pas été vraiment clairement évident, donc je voulais partager mon expérience Pour conserver le format "question/réponse" StackOverflow, je vais mettre les détails dans la question et ma solution dans la réponse.UITableView Les performances de défilement avec CALayer + masque

Détails:

J'ai eu une tableview pleine de cellules avec deux étiquettes et un contrôle personnalisé interrupteur à bascule je mis en place à partir de zéro. Si je me suis caché le contrôle à bascule, le tableau a défilé comme un champion. Cependant, avec le contrôle à bascule montré, le défilement était douloureusement agité/lent sur l'iPhone 3G. Mes cellules tableview n'ont aucun composant transparent (autre que le masque pour la couche) et je réutilise des cellules.

La commande à bascule sur commande étend UIButton et cette couche comporte deux composants - un UIImageView qui contient le coulissement partie « commutateur » de la bascule et une ellipse allongée qui est utilisée comme masque, avec un arrière-plan établi derrière la couche en -drawRect: .

Comment avez-je résoudre ce problème? Réponse à venir sous peu ...

Répondre

6

J'ai découvert que la source de la lenteur/saccadées venait d'avoir à recomposer la couche avec la sous-couche de masque sur le défilement. Je suppose qu'il fallait re-dessiner l'interrupteur à bascule chaque fois que l'écran a été redessiné.

Ma solution est de cacher la couche interrupteur à bascule/masque à moins qu'il ne change d'état. Quand il est complètement à l'intérieur ou à l'extérieur, je cache le commutateur à bascule et le remplace par une image de l'interrupteur à bascule. Lorsque l'utilisateur touche la bascule, les peaux d'image fictives, la composante réelle ToggleSwitch montre et fait l'animation à l'état opposé. Lorsque l'animation se termine, je masque le composant de l'interrupteur à bascule et montre l'image fictive, en veillant à changer l'image à l'état actuel. Cette performance de défilement améliorée SIGNIFICATIVEMENT ... J'ose dire que c'est presque aussi bon qu'une cellule de table par défaut native.

Questions connexes