这里有一些我觉得不合逻辑的地方:
当为 UIView
(在本例中为 mainView
)的属性设置动画时,将在通用类型上调用函数,而不是在 UIView 的特定实例上调用
UIView.animate(withDuration: flashDuration, delay: 0, options: UIViewAnimationOptions.allowUserInteraction, animations: {
self.mainView.backgroundColor = self.black
}, completion: nil)
这非常有用,因为我现在可以在同一位置为 UIView
的不同实例设置动画,但是如何调用通用类型的函数呢?
我从未在 Swift 的其他任何地方遇到过这种情况。
最佳答案
我不知道幕后到底发生了什么,因为 UIKit 不是开源的
在引入基于 block 的 UIView 动画方法之前,动画 View 看起来像这样,而那些方法实际上仍然可用:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
myView.center = CGPointMake(300, 300);
[UIView commitAnimations];
了解这一点,我们可以像这样实现我们自己的基于 block 的动画方法:
(void)my_animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
animations();
[UIView commitAnimations];
}
实际的动画由 Core Animation 执行,它在图层级别工作——每个 UIView 都有一个支持 CALayer 实例,负责动画和合成,而 View 主要只处理触摸事件和坐标系转换。
我不会在这里详细介绍 Core Animation 的工作原理,您可能需要阅读 Core Animation Programming Guide为了那个原因。本质上,它是一个在图层树中设置动画变化的系统,无需显式计算每个关键帧(并且实际上很难从 Core Animation 中获取中间值,您通常只需指定起始值和终止值、持续时间等,然后让系统注意细节)。
关于ios - 为什么通过在 TYPE UIView 上调用 .animate() 来触发动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44869084/