如何在UIButton上执行原生的“脉冲效果”动画-iOS


Answers:


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

迅速

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

请参阅文章“动画层内容”


1
感谢您的回答!我不得不说我有点卡住了。我完全不熟悉CALayer,也不确定如何将其与UIButton链接。另外,您的代码看起来像是在改变不透明度,而不是缩放。
约翰

8
好的)。“脉冲动画”是一个通常用于闪烁效果的术语-如该链接示例中所述。现在,我重新阅读您的问题并了解您想要什么。首先,每个视图都有自己的图层。如果QartzCore框架已添加到项目中,则只需键入myView.layer即可访问它。您可以使用Core Animation为图层设置动画。对于比例转换,您可以使用以下方法:结构字段的关键路径支持
beryllium

7
太棒了!使用@“ transform.scale”而不是@“ opacity”就像一种魅力。非常感谢!
约翰

2
如果还没有,则需要添加#import <QuartzCore/QuartzCore.h>以获取CALayers的所有定义。
progrmr

啊!除非您将实际答案更新为正确的现代版本,否则请勿编辑已过期的3年之久的答案。添加空格不会更新它。特别是三年后不要复活。
Fogmeister

30

这是它的快速代码;)

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
所有分号是怎么回事?;)
基督教徒

@Christian半冒号设置pulseAnimation常数的类型。不必使用它,但是当赋值的右侧不能清楚地表明它将分配哪种类型时,它的确会提高代码的清晰度。
周星驰

@ScottChow我猜您在谈论冒号。我的评论是对原始答案的一个玩笑,因为不需要使用Swift进行分号。猜猜答案是否经过很多编辑,现在还不那么明显:)
Christian

9

快速代码缺少fromValue,我必须添加它才能使其正常运行。

pulseAnimation.fromValue = NSNumber(float: 0.0)

forKey应该设置,否则removeAnimation不起作用。

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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.