Ios 创建动画时,为什么要向UIView类属性发送消息?
我正在学习教程。可以找到代码片段。在某些动画中,动画直接发送到Ios 创建动画时,为什么要向UIView类属性发送消息?,ios,swift,animation,uiview,Ios,Swift,Animation,Uiview,我正在学习教程。可以找到代码片段。在某些动画中,动画直接发送到ui视图。就像下面的代码片段一样 问题1:此UIView是什么类的属性?或者是我们正在向UIView发送消息,查看屏幕上的所有内容,并执行代码块中的操作?我只是想了解我们在这里传递的是哪一个属性 protocol Flashable {} extension Flashable where Self: UIView { func flash() { UIView.animate(withDuration: 0
ui视图
。就像下面的代码片段一样
问题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)
}
}
}
}
^^^我不获取ui视图。为部分设置动画^^^
对于一些人来说,它不是直接发送到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:两个动画的编写方式有什么区别?动画块在所有视图中都是全局的。给定的动画块可以自由(并鼓励)同时设置任意多个视图的动画。因此,这自然是一个“全局”函数,与任何特定视图无关
在面向对象编程中,通常将“全局”函数作为某个相关类的静态/类方法来实现。这改进了名称间距(偶尔还有其他好处,例如访问类数据)。这就是这里发生的一切UIView
是嵌套全局动画(withDuration:…)
方法的一个方便且富有表现力的地方。但这些方法实际上只是全局函数。没有严格的规则规定他们甚至必须为视图设置动画
在您的cabasicanitation
代码中,还创建了一个隐式全局CATransaction
,用于包装所有当前动画。所以“更容易理解”的版本也有点神奇,它向你隐藏了一些更复杂的部分(如果你不理解的话,它会咬你)。ui视图的ui
版本实际上更明确地描述了正在发生的事情,特别是如果您将多个事物一起设置动画。这就是添加UIView
包装器的原因之一,也是为什么它通常是为视图设置动画的更好方法。动画块在所有视图中都是全局的。给定的动画块可以自由(并鼓励)同时设置任意多个视图的动画。因此,这自然是一个“全局”函数,与任何特定视图无关
在面向对象编程中,通常将“全局”函数作为某个相关类的静态/类方法来实现。这改进了名称间距(偶尔还有其他好处,例如访问类数据)。这就是这里发生的一切UIView
是嵌套全局动画(withDuration:…)
方法的一个方便且富有表现力的地方。但这些方法实际上只是全局函数。没有严格的规则规定他们甚至必须为视图设置动画
在您的cabasicanitation
代码中,还创建了一个隐式全局CATransaction
,用于包装所有当前动画。所以“更容易理解”的版本也有点神奇,它向你隐藏了一些更复杂的部分(如果你不理解的话,它会咬你)。ui视图的ui
版本实际上更明确地描述了正在发生的事情,特别是如果您将多个事物一起设置动画。这就是添加UIView
包装器的原因之一,也是为什么它通常是设置视图动画的更好方法。该函数是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")
}
}
这意味着您可以在类型UIView
上调用函数,正如您在第一个代码段中看到的那样。您可以在中找到有关类型方法的更多信息
此函数的第二个参数是要执行的动画。这可以是单个视图上的动画(在本例中为self
)或任何其他数量的视图和动画
动画的第二个版本是动画。设置动画,然后将其附加到所需的特定层
正如文件所述,CABASICANITION是
为层特性提供基本的单关键帧动画功能的对象
该函数是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")
}
}
这意味着您可以在类型UIView
上调用函数,正如您在第一个代码段中看到的那样。您可以在中找到有关类型方法的更多信息
此函数的第二个参数是要执行的动画。这可以是单个视图上的动画(在本例中为self
)或任何其他数量的视图和动画
动画的第二个版本是动画。设置动画,然后将其附加到所需的特定层
正如文件所述,CABASICANITION是
为层特性提供基本的单关键帧动画功能的对象
谢谢。因此,理论上我们可以在ViewController
类上编写全局函数,并执行相同的操作,但是出于命名目的,它可能不是最佳选择?2.还有一个隐式的全局CasReScAcess,它封装了所有当前动画。我确信你可以把它附加到UIVIEW控制器上做一个体面的论证。毕竟,有些人可能认为动画是MVC中“C”的一部分。但事实上,你可以动画的任何东西都是UIVIEW或它的子类之一,我认为动画是MVC中“V”的一部分。作为Swift 3的一部分,我们已经朝着更加“以行动为导向”的命名方式迈出了一大步。也许用这些术语思考,你会发现早在斯威夫特出现之前,他们就把它放在了正确的地方UIViewController
会很尴尬,因为不要求视图控制器存在,但它可能已经存在了<代码>CATransaction
将动画分组在一起。所有动画都是c