Come eseguire un'animazione nativa "Effetto impulso" su un pulsante UIB - iOS


Risposte:


198
CABasicAnimation *theAnimation;

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=1.0;
theAnimation.repeatCount=HUGE_VALF;
theAnimation.autoreverses=YES;
theAnimation.fromValue=[NSNumber numberWithFloat:1.0];
theAnimation.toValue=[NSNumber numberWithFloat:0.0];
[theLayer addAnimation:theAnimation forKey:@"animateOpacity"]; //myButton.layer instead of

Swift

let pulseAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
pulseAnimation.duration = 1
pulseAnimation.fromValue = 0
pulseAnimation.toValue = 1
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
pulseAnimation.autoreverses = true
pulseAnimation.repeatCount = .greatestFiniteMagnitude
view.layer.add(pulseAnimation, forKey: "animateOpacity")

Consulta l'articolo "Animazione del contenuto del livello"


1
Grazie per la tua risposta! Devo dire che sono un po 'bloccato però. Non ho familiarità con CALayer e non sono sicuro di come collegarlo al mio UIButton. Inoltre il tuo codice sembra che stia cambiando l'opacità, non la scala.
Johann

8
va bene). "Animazione a impulsi" è un termine solitamente applicato all'effetto di sfarfallio, come detto nell'esempio in quel collegamento. Ora rileggo la tua domanda e capisco cosa vuoi. All'inizio, ogni vista ha il proprio livello. Se il framework QartzCore viene aggiunto al progetto, basta digitare myView.layerper accedervi. Puoi animare i livelli con Core Animation. Per la trasformazione in scala è possibile utilizzare questo approccio: Supporto del percorso chiave per i campi struttura
berillio

7
Fantastico! Usare @ "transform.scale" invece di @ "opacity" funziona come un fascino. Molte grazie!
Johann

2
Se non lo hai già, devi aggiungerlo #import <QuartzCore/QuartzCore.h>per ottenere tutte le definizioni per CALayers.
programma

UGH! Non modificare le risposte di 3 anni che non sono aggiornate a meno che tu non stia aggiornando la risposta effettiva alla versione moderna corretta. L'aggiunta di spazi non lo aggiorna. Soprattutto per non resuscitarlo dopo 3 anni.
Fogmeister

30

Ecco il codice swift per esso;)

let pulseAnimation:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale")
pulseAnimation.duration = 1.0
pulseAnimation.toValue = NSNumber(value: 1.0)
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
pulseAnimation.autoreverses = true
pulseAnimation.repeatCount = .greatestFiniteMagnitude
self.view.layer.add(pulseAnimation, forKey: nil)

2
Che succede con tutti i punti e virgola? ;)
Christian

@Christian il punto e virgola imposta il tipo di costante pulseAnimation. Non è necessario da usare ma tende ad aumentare la chiarezza del codice quando il lato destro di un compito non rende ovvio il tipo che assegnerà.
Scott Chow

@ScottChow Immagino che tu stia parlando del colon. Il mio commento è stato uno scherzo alla risposta originale, poiché non è necessario il punto e virgola con Swift. Immagino che non fosse così ovvio ora che la risposta è stata modificata molto :)
Christian

9

Nel codice swift manca un fromValue, ho dovuto aggiungerlo per farlo funzionare.

pulseAnimation.fromValue = NSNumber(float: 0.0)

Inoltre forKeydovrebbe essere impostato, altrimenti removeAnimationnon funziona.

self.view.layer.addAnimation(pulseAnimation, forKey: "layerAnimation")

3
func animationScaleEffect(view:UIView,animationTime:Float)
{
    UIView.animateWithDuration(NSTimeInterval(animationTime), animations: {

        view.transform = CGAffineTransformMakeScale(0.6, 0.6)

        },completion:{completion in
            UIView.animateWithDuration(NSTimeInterval(animationTime), animations: { () -> Void in

                view.transform = CGAffineTransformMakeScale(1, 1)
            })
    })

}


@IBOutlet weak var perform: UIButton!

@IBAction func prefo(sender: AnyObject) {
    self.animationScaleEffect(perform, animationTime: 0.7)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.