J'ai un problème de performances.

J'ai créé un UIView et écrasé sa fonction drawRect. À cette fonction, je dessinais une image (une grande), et par-dessus, un carré blanc sur tout l'écran avec un polygone à l'intérieur, avec CGContextEOFillPath. Le résultat est un écran blanc avec une partie de l'image (définie par le polygone) affichée.

Après cela, j'ai créé une fonction pour animer la transition de ce polygone vers un autre. Outre l'animation du polygone, l'image doit également être mise à l'échelle et déplacée pour corriger l'affichage à l'écran. Je l'ai fait avec un NSTimer. L'animation du polygone consiste à calculer la distance entre chaque sommet et à se déplacer ensuite vers une position en fonction du temps écoulé. Cela fonctionnait très bien sur le simulateur, mais restait vraiment bloqué sur l'appareil.

En lisant sur les performances, ici à stackoverflow, j'ai trouvé l'alternative d'utiliser beginAnimations et commitAnimations. Je change tout pour utiliser cette approche avec l'image. Mais que puis-je faire avec le polygone. Le polygone est dessiné avec CGContextMoveToPoint et CGContextAddLineToPoint, donc je pense qu'il ne peut pas être animé avec beginAnimations. Est-ce que je corrige? Y a-t-il une meilleure approche pour le faire?

Le résultat souhaité est quelque chose comme cette application de lecture de bandes dessinées : http://www.comixology.com/iphoneapp (cliquez sur visite guidée. au milieu de la vidéo, ils montrent la fonction "masquage automatique")

1
Leandro Alves 8 janv. 2010 à 19:12

2 réponses

Meilleure réponse

Avec Core Animation, vous pouvez animer des propriétés "animables" (sic). La documentation d'Apple énumère les propriétés animables sous Mac OS X :

http://url.akosma.com/55

Dans le cas de l'iPhone, la documentation UIView dit explicitement "animable" lorsqu'une propriété donnée est, hum, animable. Les plus puissantes d'entre elles sont la propriété "transform" de (IMHO) UIView, qui prend les structures CGAffineTransform comme entrées, ou la propriété "transform" de CALayer (qui prend les structures CATransform3D). Les deux sont animables et vous donnent un pouvoir énorme pour créer tout type de transition que vous souhaitez.

Maintenant, dans votre cas, en effet, vous ne pouvez pas animer le polygone de manière "facile". Mon pari serait dans votre cas d'essayer de cartographier les CGAffineTransforms qui correspondent à vos besoins (échelle, traduction) et de l'appliquer à une vue fixe, non animée, créée à l'aide de votre code Quartz.

J'espère avoir été assez clair :)

0
Adrian Kosmaczewski 8 janv. 2010 à 19:56