快速动画按钮边框

van*_*boy 6 animation swift

我最近学会了如何使用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)

有什么方法可以解决这个问题吗?

Mes*_*ery 9

这是一个简单的解决方案:

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)

这个对我有用.


bud*_*ino 8

您无法为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)


mat*_*att 4

borderColor和等功能borderWidth是按钮图层的属性。这告诉您必须使用的核心动画(而不是像您的代码尝试那样使用视图动画)来为这些功能设置动画。它运作得非常好;borderWidth在此动画中,我演示了当您使用核心动画将和一起制作动画时会发生什么cornerRadius

在此输入图像描述

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