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都有类方法