我想通过一些戏剧来制作一个随机数的“获取”动画。当用户点击数字时,我希望发生以下情况:
我在这里已经阅读了很多答案,并提出类似于以下内容的内容......
func numberClicked() {
UIView.animateWithDuration(2,
animations: {
self.numberLabel.textColor = uicolor_verylight
self.activityIndicator.startAnimating()
},
completion: {(value: Bool) in
for i in 1...30 {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64((Double(i)/20) * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
self.numberLabel.fadeTransition(0.2)
self.numberLabel.text = String(Int(arc4random_uniform(30) + 1))
if(i == 30) {
UIView.animateWithDuration(2, animations: { () -> Void in
self.numberLabel.textColor = uicolor_normal
self.activityIndicator.stopAnimating()
})
}
}
}
}
)
}
这使用了这个UIView扩展......
extension UIView {
func fadeTransition(duration:CFTimeInterval) {
let animation:CATransition = CATransition()
animation.timingFunction = CAMediaTimingFunction(name:
kCAMediaTimingFunctionEaseInEaseOut)
animation.type = kCATransitionFade
animation.duration = duration
self.layer.addAnimation(animation, forKey: kCATransitionFade)
}
}
问题是我的animateWithDurations没有动画,循环立即运行,而不是在第一个动画发生后。
我出错的任何想法?或者也许有一种更简单的方法来完成我在这里做的事情?非常感谢提前!
答案 0 :(得分:1)
UILabel的textColor属性不可动画。它不可动画的主要原因是因为UILabel使用CALayer而不是CATextLayer。
其中一个解决方案可以是对UILabel进行子类化并使其使用CATextLayer。这在某种程度上非常麻烦,因为CATextLayer不支持NSAttributedText。
我发现的一个解决方法是使用transitionWithView并使用TransitionCrossDissolve作为选项,而不是使用animateWithDuration。它将为您的文本颜色过渡提供良好的淡入淡出效果。 请查看以下代码,例如:
UIView.transitionWithView(view, duration: 2.0, options: .TransitionCrossDissolve, animations: { () -> Void in
//animation code
}, completion: nil)
使用以上参考是您的代码。
UIView.transitionWithView(self.numberLabel, duration: 2.0, options: .TransitionCrossDissolve, animations: { () -> Void in
self.numberLabel.backgroundColor = uicolor_verylight
self.activityIndicator.startAnimating()
}) { (value: Bool) -> Void in
if value == true {
for i in 1...30 {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64((Double(i)/20) * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
self.numberLabel.text = String(Int(arc4random_uniform(30) + 1))
if(i == 30) {
UIView.transitionWithView(self.numberLabel, duration: 2.0, options: .TransitionCrossDissolve, animations: { () -> Void in
self.numberLabel.textColor = uicolor_normal
self.activityIndicator.stopAnimating()
}, completion: nil)
}
}
}
}
}
希望这能解决您的问题。