Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 创建动画时,为什么要向UIView类属性发送消息?_Ios_Swift_Animation_Uiview - Fatal编程技术网

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