web-dev-qa-db-fra.com

Comment faire une animation "effet d'impulsion" native sur un UIButton - iOS

J'aimerais avoir une sorte d'animation Pulse (boucle infinie "scale in scale out") sur un bouton UIB afin qu'elle attire immédiatement l'attention des utilisateurs.

J'ai vu ce lien Comment créer un effet Pulse en utilisant -webkit-animation - anneaux extérieurs mais je me demandais s'il était possible de faire cela uniquement à l'aide d'un framework natif?

86
Johann
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

Rapide

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")

Voir l'article "Animation du contenu de la couche"

191
beryllium

Voici le Swift pour le faire;)

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)
27
Ravi Sharma

Le code Swift ne contient pas de fromValue, je devais l’ajouter pour le faire fonctionner.

pulseAnimation.fromValue = NSNumber(float: 0.0)

De plus, forKey devrait être défini, sinon removeAnimation ne fonctionne pas.

self.view.layer.addAnimation(pulseAnimation, forKey: "layerAnimation")
8
Bassebus
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)
}
3
Ahmad ELkhwaga