去年Apple的新操作系统版本中没有很多新的框架和API。相反,重点显然在于引擎盖下的改进和性能提升,就像WWDC主题演讲中提到的那样。Apple已经取得了一些非常好的改进的另一个领域是他们的一些低级框架如何导入Swift - 特殊性Core Animation。
核心动画可以说是Apple平台上最重要的框架之一,因为它为所有设备的UI提供了很大的支持。在我的演讲*“超越动画与核心动画”中*,我展示了Core Animation 不仅是一个动画框架 - 它还是一个功能强大的通用渲染工具,可以通过多种不同的方式在应用程序中创建自定义图形。
在今天的WWDC更新中,让我们来看看今年的Core Animation如何变得更加*“Swifty”*,这要归功于一些更好的注释以及之前依赖于字符串的API现在使用了多少综合枚举和选项集。
形状
绘制程序化形状可以是一种很好的方法,可以删除依赖于分辨率的资源,并使应用程序中的内容更具动态性。用于绘制自定义形状的API逐年变得更好,更好用于Swift,今年所有的字符串常量都变成了正确的类型。例如,现在我们可以使用点语法以类型安全的方式将圆边添加到一行:
let line = CAShapeLayer()
line.lineCap = .round
复制代码
对于更复杂的形状,我们现在还可以使用点语法来描述使用颜色填充重叠形状时的自定义填充模式:
let shape = CAShapeLayer()
shape.fillRule = .evenOdd
复制代码
之前,上述两个属性都使用字符串,导致更难的API可发现性和更少的类型安全性。
我将CAShapeLayer
在我的“核心动画宝石”系列的即将上市的条目中详细介绍它可以用于的所有细节。
动画
更重要的是,对Core Animation的实际动画API进行了更改,其中有许多变体CAAnimation
。许多开发人员认为这种类型的动画比UIKit的内置动画API更难以使用,即使它们提供了更多的功能和控制,但他们在Swift中并没有真正感受到“在家” - 直到现在。
就像Core Animation的其他部分现在已经为Swift完全注释一样,动画现在使用强类型选项,既可以用于动画填充图层属性的方式,也可以用于引用计时功能:
let animation = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
animation.fillMode = .forwards
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
复制代码
使用#keyPath
编译器命令,我们甚至可以获取动画API的最终字符串类型部分 - 我们想要设置动画的关键路径 - 并将其转换为类型安全。看看这个完整的例子,我们正在创建一个用于旋转图层的定制定时动画,很难说我们实际上是在使用旧的基于Objective-C和C的API:
let animation = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
animation.fillMode = .forwards
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
animation.duration = 5
animation.fromValue = layer.transform
animation.toValue = CATransform3DMakeRotation(.pi, 0, 0, 1)
layer.add(animation, forKey: "rotate")
复制代码
在Core Animation的其他类型和类中也可以找到适用于CAShapeLayer
和CAAnimation
朋友的相同类型的调整和改进。例如,CATextLayer
现在使用枚举进行对齐和截断属性,CAConstraint
现在使用can 定义图层约束也可以以类型安全的方式完成。
结论
在Swift中使用Core Animations时添加这些修改可能看起来微不足道并且一开始并不重要,但它确实有帮助 - 无论是在保持我们的源代码优秀,安全和干净方面,还在使Core Animation这样的框架更易于访问到新一代Swift开发人员。
我很高兴Apple回过头来注释这些基于Objective-C和C的API,而不是将它们扔掉并“从头开始”重写它们。核心动画是一个非常强大和灵活的工具,使它看起来不像一个低级无法访问的框架,更像是一个易于使用的所有Swift开发人员,我认为是一个巨大的胜利。