2016-12-29 62 views
1

我正在关注this教程。代码片段可以找到here。在一些动画中,动画被直接发送到UIView。像下面的代码片段一样。创建动画时,为什么要向UIView类属性发送消息?

问题1:这个UIView是什么类的属性?或者,我们是否在屏幕上的所有内容的UIView上发送消息,以完成代码块中的内容?我只是想了解我们在这里短信哪个属性...

protocol Flashable {} 

extension Flashable where Self: UIView { 
    func flash() { 
     UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: { 
      self.alpha = 1.0 
     }) { (animationComplete) in 
      if animationComplete == true { 
       UIView.animate(withDuration: 0.3, delay: 2.0, options: .curveEaseOut, animations: { 
        self.alpha = 0.0 
        }, completion: nil) 
      } 
     } 
    } 
} 

^^^我不明白UIView.animate一部分。 ^^^

而对于一些它不直接发送到UIView

extension Jitterable where Self: UIView { 
    func jitter() { 
     let animation = CABasicAnimation(keyPath: "position") 
     animation.duration = 0.05 
     animation.repeatCount = 5 
     animation.autoreverses = true 
     animation.fromValue = NSValue(cgPoint: CGPoint.init(x: self.center.x - 5.0, y: self.center.y)) 
     animation.toValue = NSValue(cgPoint: CGPoint.init(x: self.center.x + 5.0, y: self.center.y)) 
     layer.add(animation, forKey: "position") 
    } 
} 

^^^上面的代码更容易理解^^^

但是当你想打电话给他们都这样做:

errorLabel.flash() 
errorLabel.jitter() 

问题2:有什么之间的区别这两种动画是如何写的?

回答

3

动画块在所有视图中都是全局的。给定的动画块是免费的(并鼓励)在同一时间创建尽可能多的视图。所以这自然是一个“全球”功能,并不受任何特定观点的束缚。

在面向对象编程中,通常将“全局”函数实现为某些相关类的静态/类方法。这改进了名称间隔(并且偶尔还有其他好处,例如访问类数据)。这就是这里发生的一切。 UIView是嵌套全球animate(withDuration:...)方法的便利和富有表现力的地方。但是这些方法实际上只是全局功能。没有严格的规定,他们甚至不得不制作动画视图。

在您的CABasicAnimation代码中,还创建了隐式全局CATransaction,它包含所有当前动画。因此,“更易于理解”的版本也更加神奇,它隐藏了一些更复杂的部分(如果你不了解它,可能会咬你)。 UIView版本实际上对发生的事情更加明确,特别是如果您将多个事物一起动画。这是添加了UIView包装的原因之一,以及为什么它通常是动画视图更好的方法。

+0

Thanks 1.所以理论上我们可以在'ViewController'类上编写全局函数,但是对于命名的目的,它可能不是最好的选择吗? 2. *创建隐式全局CATransaction以包装所有当前动画* < - 包装整个应用程序中的所有动画(尽管我们通常每次运行一个动画片段,因为它耗费CPU)? – Honey

+1

我相信你可以做一个关于将它附加到UIViewController的一个体面的论点 - 毕竟有些人可能认为动画是MVC中“C”的一部分。但事实上,任何可以生成动画的东西都是UIView或它的一个子类,我认为动画是MVC中“V”的一部分。作为Swift 3的一部分,已经有了一个强有力的举措,即更加“面向行动”的事物命名。也许可以用这些术语来思考,在Swift出现之前很久,你就可以看到他们把它放在正确的地方。 :-) – dfd

+0

你能回答我评论的第二个问题吗? – Honey

1

animate(withDuration:animations:completion:)函数是一种类型的方法UIView

这意味着您可以在类型UIView上调用函数,如您在第一个代码片段中看到的那样。您可以在Swift Language Guide

中找到更多关于类型方法的信息。此函数的第二个参数是您要执行的动画。这可以是单个视图上的动画(在本例中为self)或任何其他数量的视图和动画。

第二版动画是CABasicAnimation。您设置动画,然后将其附加到所需的特定图层。

作为文档说,一个CABasicAnimation是

,其提供一个层特性基本的单关键帧动画功能的对象。

相关问题