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

标签 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 的其他任何地方遇到过这种情况。

最佳答案

我不知道幕后到底发生了什么,因为 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/

相关文章:

iOS - 将 BLE 设备连接到应用程序和 iOS

iphone - 如何将核心数据添加到 iOS 静态框架?

ios - 如何使用更少的内存在 collectionView 中显示照片库

ios - 来自网址的按钮图像未显示

swift - 如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?

ios - AVPlayer 键值的 currentItem 是否可观察?

ios - swift 火力地堡 : Update specific objects resulting from Firebase query

Swift 2 MKMapViewDelegate rendererForOverlay 编译警告

objective-c - 使用现有单 View 应用程序代码创建动画的最佳选择是什么?

javascript - 如何构建多阶段 Web 表单?