我最近学会了如何使用alpha动画一个按钮,以便它在Swift中淡入/淡出.但是,如果我只希望边框的alpha变化,那么动画似乎不起作用.相反,它从一个州"跳跃"到另一个州.
UIView.animateWithDuration(1.0, delay: 0.0, options: nil, animations: {
var borderColor = UIColor(red: 0.41, green: 1.28, blue: 1.85, alpha: 0.0)
self.startButton.layer.borderColor = borderColor.CGColor
}, completion: nil);
Run Code Online (Sandbox Code Playgroud)
例如,上面的代码没有动画,而是在边界的alpha 1.0和0.0之间产生"跳跃".
但是,这可以正常工作(更改整个按钮的alpha):
UIView.animateWithDuration(1.0, delay: 0.0, options: nil, animations: {
self.startButton.alpha = 1;
}, completion: nil);
Run Code Online (Sandbox Code Playgroud)
有什么方法可以解决这个问题吗?
这是一个简单的解决方案:
let borderWidth:CABasicAnimation = CABasicAnimation(keyPath: "borderWidth")
borderWidth.fromValue = 0
borderWidth.toValue = 0.9
borderWidth.duration = 0.5
yourView.layer.borderWidth = 0.5
yourView.layer.borderColor = UIColor.whiteColor().CGColor
yourView.layer.addAnimation(borderWidth, forKey: "Width")
yourView.layer.borderWidth = 0.0
Run Code Online (Sandbox Code Playgroud)
这个对我有用.
您无法为layer使用UIView动画的部分动画制作动画.另外,我认为不可能为边框的alpha值设置动画.要获得类似的效果,您可以设置边框宽度的动画:
我做了这个UIView扩展:
extension UIView {
func animateBorderWidth(toValue: CGFloat, duration: Double) {
let animation:CABasicAnimation = CABasicAnimation(keyPath: "borderWidth")
animation.fromValue = layer.borderWidth
animation.toValue = toValue
animation.duration = duration
layer.add(animation, forKey: "Width")
layer.borderWidth = toValue
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法显示视图的边框:
startButton.animateBorderWidth(toValue: 1, duration: 0.3)
Run Code Online (Sandbox Code Playgroud)
并使用以下方法隐藏它:
startButton.animateBorderWidth(toValue: 0, duration: 0.3)
Run Code Online (Sandbox Code Playgroud)
borderColor和等功能borderWidth是按钮图层的属性。这告诉您必须使用层的核心动画(而不是像您的代码尝试那样使用视图动画)来为这些功能设置动画。它运作得非常好;borderWidth在此动画中,我演示了当您使用核心动画将和一起制作动画时会发生什么cornerRadius:

的动画borderColor也会以类似的方式工作。