2010-01-08 5 views
1

J'ai un problème de performance.Comment animer un masque de polygone avec des performances?

J'ai créé un UIView et j'ai écrasé sa fonction drawRect. A cette fonction, je dessinais une image (grosse), 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 polygone. En plus de l'animation polygonale, l'image doit également être mise à l'échelle et déplacée pour corriger l'image affichée à l'écran. Je l'ai fait avec un NSTimer. L'animation du polygone consiste à calculer la distance entre chaque sommet et à passer ensuite à une position selon elapsedTime. Cela a très bien fonctionné sur le simulateur, mais il a vraiment été bloqué sur l'appareil.

En ce qui concerne les performances, ici, chez stackoverflow, j'ai trouvé l'alternative à 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 crois qu'il ne peut pas être animé avec beginAnimations. Un je corrige? Y a-t-il une meilleure approche pour le faire?

Le résultat souhaité est quelque chose comme cette application lecteur de BD: (. Cliquer sur la visite guidée au milieu de la vidéo, ils montrent le « masquage automatique » caractéristique) http://www.comixology.com/iphoneapp

Répondre

0

Ma suggestion serait d'utiliser une superposition CAShapeLayer sur votre principale vue de l'image, avec le CAShapeLayer étant la taille de la vue que vous voulez masquer et ayant un chemin de polygone pour un trou au centre de celui-ci. CAShapeLayers vous permet d'animer d'un CGPathRef à l'autre en douceur, tant que les deux chemins ont le même nombre de points de contrôle. Vous aurez besoin d'utiliser ici un CABasicAnimation pour faire cela, plutôt qu'un bloc UIView begin/commitAnimations, mais ce n'est pas trop difficile. Joe Ricioppo a un bon exemple d'animation de chemins CAShapeLayer dans son article here.

+0

Merci, je vais essayer cette approche d'abord et si je ne réussis pas, je vais essayer celui d'Adrian. Après ça, je déteste les réponses, d'accord? Merci encore! –

0

Avec Core Animation vous pouvez animer « animable » (sic) propriétés. la documentation d'Apple dans animables propriétés énumère Mac OS X:

http://url.akosma.com/55

Dans le cas de l'iPhone, la documentation UIView dit explicitement "animable" quand une propriété donnée est, hum, animable. Les plus puissants d'entre eux sont la propriété "transform" de UIView (IMHO), qui prend en entrée les structures CGAffineTransform, ou la propriété "transform" de CALayer (qui prend les structures de CATransform3D). Les deux sont animables et vous donnent un pouvoir énorme pour créer toute sorte de transition que vous voulez. 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 mapper CGAffineTransforms qui correspond à vos besoins (échelle, traduction) et de l'appliquer à une vue fixe, non animée, créée en utilisant votre code Quartz.

J'espère que je suis assez clair :)

Questions connexes