动画获取随机数

时间:2016-01-10 22:02:52

标签: ios swift animation

我想通过一些戏剧来制作一个随机数的“获取”动画。当用户点击数字时,我希望发生以下情况:

  1. 数字渐变为不同的颜色(例如持续时间为2秒)
  2. 完成上述操作后,数字会轻弹几个不同的随机数 - 这应该看起来很流畅和动画
  3. 显示最终的随机数
  4. 然后数字会淡化为原始颜色
  5. 我在这里已经阅读了很多答案,并提出类似于以下内容的内容......

    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没有动画,循环立即运行,而不是在第一个动画发生后。

    我出错的任何想法?或者也许有一种更简单的方法来完成我在这里做的事情?非常感谢提前!

1 个答案:

答案 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)
                            }
                        }
                    }
                }
        }

希望这能解决您的问题。