为什么通过在TYPE UIView上调用.animate()来触发动画

时间:2017-07-02 08:59:03

标签: ios swift animation uiview

这是我认为不符合逻辑的事情:

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

UIView.animate(withDuration: flashDuration, delay: 0, options: UIViewAnimationOptions.allowUserInteraction, animations: {
        self.mainView.backgroundColor = self.black
    }, completion: nil)

这非常有用,因为我现在可以在同一个地方动画UIView的不同实例,但是如何在泛型类型上调用函数?

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

1 个答案:

答案 0 :(得分:3)

我不知道引擎盖下究竟发生了什么,因为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];
}

实际动画由Core Animation执行,它在图层级工作 - 每个UIView都有一个支持动画和合成的支持CALayer实例,而视图主要处理触摸事件和协调系统转换。

我不会在此详细介绍Core Animation的工作原理,您可能需要阅读Core Animation Programming Guide。从本质上讲,它是一个动画层树动画的系统,无需显式计算每个关键帧(实际上很难从Core Animation中获取中间值,通常只需指定值和持续时间等,然后让系统使用照顾细节。)