2015-04-03 88 views
4

我最近学会了如何使用alpha对按钮进行动画处理,以便它在Swift中淡入/淡出。但是,如果我只想让边框本身的阿尔法发生变化,那么动画似乎不起作用。相反,它从一个州到另一个州“跳跃”。在swift中动画按钮边框

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

上面的代码例如不会动画,而是会在边界的alpha 1.0和0.0之间产生“跳跃”。

然而,这将正常工作(改变整个按键的字母):

UIView.animateWithDuration(1.0, delay: 0.0, options: nil, animations: { 
    self.startButton.alpha = 1; 
}, completion: nil); 

有什么办法来解决这个问题?

+0

不是所有的东西都可以用'UIView.animateWithDuration'动画 – GriffeyDog 2015-04-03 15:02:51

回答

1

功能如borderColorborderWidth是按钮的属性。这告诉你,你必须使用层的核心动画 - 不要视动画,因为你的代码试图去做 - 动画这些功能。它工作得很好;在这个动画,我演示时使用核心动画动画borderWidthcornerRadius在一起会发生什么:

enter image description here

borderColor的动画将同样的工作。

+0

我可以as k我将如何去动画图层而不是视图? – vanillaboy 2015-04-03 15:33:36

+0

阅读我上面的答案。你会使用核心动画。核心动画是直接的图层动画。查看动画仅适用于五个特定的视图属性。核心动画适用于_any_动画层属性。 – matt 2015-04-03 15:36:13

+0

另请参阅我的书:http://www.apeth.com/iOSBook/ch17.html#_core_animation – matt 2015-04-03 15:42:47

5

这里有一个简单的解决方案:

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 

这对我的作品。

1

使用UIView动画不能为动画的部分动画制作layer。另外,我不认为可以为边界的alpha值设置动画。为了达到类似的效果,你可以动画边框的宽度:使用

func animateBorderWidth(view: UIView, from: CGFloat, to: CGFloat, duration: Double) { 
    let animation:CABasicAnimation = CABasicAnimation(keyPath: "borderWidth") 
    animation.fromValue = from 
    animation.toValue = to 
    animation.duration = duration 
    view.layer.add(animation, forKey: "Width") 
    view.layer.borderWidth = to 
} 

,然后显示您的视图的边界:

我用这个方法

animateBorderWidth(view: startButton, from: 0, to: 1, duration: 0.3) 

和隐藏它通过使用:

animateBorderWidth(view: startButton, from: 1, to: 0, duration: 0.3)