2012-04-15 4 views
5

Nella mia app iOS 5 ho un UIButton personalizzato che ha un globo rosso come immagine. Toccando il pulsante mi piacerebbe che il globo iniziasse a pulsare/sbiadire tra rosso e verde. Ho entrambe le immagini rosse e verdi e può con successo cross-disolve tra i due utilizzando il seguente codice:Animazione looped, reversibile utilizzando Core Animation

CABasicAnimation *imageSwitchAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];  
imageSwitchAnimation.fromValue = (id)[UIImage imageNamed:@"red.png"].CGImage; 
imageSwitchAnimation.toValue = (id)[UIImage imageNamed:@"green.png"].CGImage; 
imageSwitchAnimation.duration = 1.5f;   
[self.button.imageView.layer addAnimation:imageSwitchAnimation forKey:@"animateContents"]; 

Tuttavia, vorrei l'animazione di continuare per sempre (o meglio, fino a quando gli dico di fermarsi) e anche per l'animazione per invertire e loop. In altre parole, dissolvenza rosso -> verde -> rosso e quindi ripetere.

Ho provato a inserire il blocco dell'animazione in un ciclo infinito (insieme a una logica per determinare se la dissolvenza dovrebbe passare dal rosso -> verde o verde -> rosso) ma questo blocca solo l'intera app.

Altre soluzioni sembrano utilizzare Cocos2d, che sembra abbastanza pesante poiché questa è l'unica animazione di cui ho bisogno nell'app (quindi non voglio usare tali framework se non assolutamente necessario).

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

23

Sì, è possibile farlo direttamente all'interno dello CABasicAnimation. Il trucco è che molti dei suoi metodi più importanti non sono nello CABasicAnimation Class Reference, o persino nelle sue superclassi. CABasicAnimation implementa un protocollo chiamato CAMediaTiming. Vedi lo CAMediaTiming Protocol Reference.

Si desidera conoscere due proprietà in particolare: autoreverses e repeatCount. Entrambi sono auto-esplicativi, ma cosa succede se vuoi ripetizioni infinite? Dalla voce per repeatCount:

Può essere frazionale. Se repeatCount è 0, viene ignorato. Il valore predefinito è 0. Se vengono specificati sia repeatDuration che repeatCount, il comportamento non è definito.

L'impostazione di questa proprietà su HUGE_VALF farà sì che l'animazione si ripeta per sempre.

Riesci a capire da lì?

+0

Grazie mille - funziona perfettamente! Molto chiaramente spiegato anche :) – Skoota