Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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类型上调用.animate()会触发动画_Ios_Swift_Animation_Uiview - Fatal编程技术网

Ios 为什么在UIView类型上调用.animate()会触发动画

Ios 为什么在UIView类型上调用.animate()会触发动画,ios,swift,animation,uiview,Ios,Swift,Animation,Uiview,有一件事我觉得不合逻辑: 设置UIView(在本例中为mainView)属性的动画时,会在泛型类型上调用函数,而不是在UIView的特定实例上调用函数 UIView.animate(withDuration: flashDuration, delay: 0, options: UIViewAnimationOptions.allowUserInteraction, animations: { self.mainView.backgroundColor = self.black

有一件事我觉得不合逻辑:

设置
UIView
(在本例中为
mainView
)属性的动画时,会在泛型类型上调用函数,而不是在
UIView
的特定实例上调用函数

UIView.animate(withDuration: flashDuration, delay: 0, options: UIViewAnimationOptions.allowUserInteraction, animations: {
        self.mainView.backgroundColor = self.black
    }, completion: nil)
这非常有用,因为我现在可以在同一个位置设置
UIView
的不同实例的动画,但是如何能够对泛型类型调用函数呢?


我在Swift的其他地方从未遇到过这种情况。

我不知道到底发生了什么,因为UIKit不是开源的

在引入基于块的UIView动画方法之前,动画视图看起来是这样的,这些方法实际上仍然可用:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
myView.center = CGPointMake(300, 300);
[UIView commitAnimations];
知道了这一点,我们可以实现我们自己的基于块的动画方法,如下所示:

(void)my_animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    animations();
    [UIView commitAnimations];
}
实际动画由核心动画执行,核心动画在层级别工作–每个UIView都有一个后台CALayer实例,负责动画和合成,而视图主要处理触摸事件和坐标系转换


我不会在这里详细介绍核心动画是如何工作的,你可能会想读一些相关的文章。本质上,它是一个在层树中设置更改动画的系统,无需显式计算每个关键帧(实际上很难从核心动画中获得中间值,通常只需指定起始值和终止值、持续时间等,并让系统处理细节).

我不知道到底发生了什么,因为UIKit不是开源的

在引入基于块的UIView动画方法之前,动画视图看起来是这样的,这些方法实际上仍然可用:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
myView.center = CGPointMake(300, 300);
[UIView commitAnimations];
知道了这一点,我们可以实现我们自己的基于块的动画方法,如下所示:

(void)my_animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    animations();
    [UIView commitAnimations];
}
实际动画由核心动画执行,核心动画在层级别工作–每个UIView都有一个后台CALayer实例,负责动画和合成,而视图主要处理触摸事件和坐标系转换


我不会在这里详细介绍核心动画是如何工作的,你可能会想读一些相关的文章。本质上,它是一个在层树中设置更改动画的系统,没有显式地计算每个关键帧(实际上很难从核心动画中获得中间值,通常只需指定起始值和终止值、持续时间等,并让系统处理细节)。

这有点混乱,因为你在用Obj-C代码解释一个快速的问题。此外,我仍然不明白如何对类型而不是类型的实例调用方法。swift和objc之间有一条很细的线,99%的api很容易转换(到和从),这没有什么区别。这个概念还是一样的。这有点让人困惑,因为你在用Obj-C代码解释一个快速的问题。此外,我仍然不明白如何对类型而不是类型的实例调用方法。swift和objc之间有一条很细的线,99%的api很容易转换(到和从),这没有什么区别。概念保持不变,它不是“泛型类型”。这是一个类方法。Objective-C和Swift都有类方法。它不是“泛型类型”。这是一个类方法。Objective-C和Swift都有类方法