核心动画示例

什么核心动画可以帮助您:

  • 高帧率和流畅的动画效果,而不会给CPU造成负担,也不会降低应用程序的运行速度。
  • 对应用程序的动画进行更细粒度的控制。
  • UIView样式较高,例如拐角半径,阴影…

您可以下载最终项目,以在阅读本教程时了解更多信息

核心动画管理您应用的内容

核心动画本身不是绘图系统。 它是用于在硬件中合成和处理应用程序内容的基础结构。 该基础结构的核心是图层对象 ,您可以使用这些对象来管理和操作内容。 图层将您的内容捕获到位图中,图形硬件可以轻松地对其进行操作。 在大多数应用程序中,图层用作管理视图内容的一种方式,但是您也可以根据需要创建独立的图层。

您可以通过调用视图的layer属性来访问此layer对象。 以下示例通过更改视图图层的背景色来更改视图的背景色:

您还需要将UIColor转换为CGColor以获得图层的backgroundColor属性值

可以将层组织到层次结构中

可以按层次排列图层以创建父子关系。 层的排列以类似于视图的方式影响它们管理的视觉内容。 附加到视图的一组图层的层次结构反映了相应的视图层次结构。 您还可以将独立图层添加到图层层次结构中,以将应用程序的视觉内容扩展到视图之外。

我们将查看以下示例。 我们将创建一个新层并将其添加到主要视图层:

图层支持角半径

您可以通过在图层上添加圆角半径来为图层创建圆角矩形效果。 要将角半径应用到图层,请为该图层的cornerRadius属性指定一个值。 您指定的半径值以磅为单位测量,并在显示之前应用于图层的所有四个角。

图层支持内置阴影

CALayer类包含几个用于配置阴影效果的属性。 阴影使图层看起来像是漂浮在其基础内容之上,从而增加了图层的深度。 您可以控制阴影的颜色,相对于图层内容的位置,不透明度和形状。

动画化对图层属性的简单更改

您可以根据需要隐式或显式执行简单的动画。 隐式动画使用默认的时间和动画属性执行动画,而显式动画需要您自己使用动画对象配置这些属性。 因此,隐式动画非常适合您希望无需大量代码即可进行更改且默认计时适合您的情况。

要使用动画对象显式进行相同的更改,请创建一个CABasicAnimation对象,然后使用该对象配置动画参数。 在将动画添加到图层之前,可以设置动画的开始和结束值,更改持续时间或更改任何其他动画参数。 下面的示例演示如何使用动画对象淡出图层。 创建对象时,可以为要设置动画的属性指定关键路径,然后设置动画参数。 要执行动画,请使用addAnimation:forKey:方法将其添加到要设置动画的图层中。

使用关键帧动画更改图层属性

基于属性的动画将属性从开始值更改为结束值,而CAKeyframeAnimation对象使您可以以线性或非线性方式对一组目标值进行动画处理。 关键帧动画由一组目标数据值和应达到每个值的时间组成。 在最简单的配置中,您可以使用数组指定值和时间。 对于图层位置的更改,您还可以使更改遵循路径。 动画对象采用您指定的关键帧,并通过在给定的时间段内从一个值插入下一个值来构建动画。

以下示例显示了图层的position属性的5秒钟动画。 对该位置进行动画处理以遵循使用CGPath数据类型指定的路径。

指定关键帧值

关键帧值是关键帧动画中最重要的部分。 这些值定义了动画执行过程中的行为。 指定关键帧值的主要方法是作为对象数组。 放入数组的内容取决于属性所需的数据类型。

  • 对于采用CGRect属性(例如边界和框架属性), NSValue每个矩形包装在NSValue对象中。
  • 对于图层的transform属性,将每个CATransform3D矩阵包装在NSValue对象中。 对此属性进行动画处理将使关键帧动画依次将每个变换矩阵应用于该图层。
  • 在设置图层的contents属性动画时,请指定CGImageRef数据类型的数组。

对于采用CGPoint数据类型的属性,可以创建点数组(包装在NSValue对象中),也可以使用CGPathRef对象指定要遵循的路径。 指定点数组时,关键帧动画对象会在每个连续点之间绘制一条直线,并遵循该路径。 指定CGPathRef对象时,动画从路径的起点开始,并遵循其轮廓,包括沿任何曲面。

指定关键帧动画的时间

keyTimes属性定义应用每个关键帧值的时间点。

一起对多个更改进行动画处理

如果要同时将多个动画应用于图层对象,则可以使用CAAnimationGroup对象将它们组合在一起。 通过提供一个配置点,使用组对象可简化对多个动画对象的管理。 应用于组的时间和持续时间值会覆盖各个动画对象中的相同值。

下面的示例演示如何使用动画组在相同的时间和相同的时间执行两个与边框相关的动画。

过渡动画支持对图层可见性的更改

顾名思义,过渡动画对象为图层创建了动画的视觉过渡。 过渡对象最常见的用途是以一种协调的方式为一层的外观和另一层的消失设置动画。 与基于属性的动画不同,在动画中,动画会更改图层的一个属性,而过渡动画会操纵图层的缓存图像以创建视觉效果,而仅通过更改属性就很难或不可能做到。 使用标准的过渡类型,您可以执行显示,推动,移动或淡入淡出动画。

要执行过渡动画,请创建一个CATransition对象,并将其添加到过渡所涉及的图层中。 您可以使用过渡对象来指定要执行的过渡类型以及过渡动画的起点和终点。 您也不需要使用整个过渡动画。 过渡对象使您可以指定动画时要使用的开始和结束进度值。 这些值使您可以执行诸如在动画的中点开始或结束动画之类的操作。

以下示例显示了用于在两个视图之间创建动画推送过渡的代码。 在示例中, myView1myView2都位于同一父视图中的同一位置,但是当前仅myView1是可见的。 按下过渡会使myView1滑出并淡入淡出,直到它被隐藏,而myView2从右侧滑入并变为可见。 更新两个视图的hidden属性可确保在动画结束时两个视图的可见性正确。

当同一转换涉及两个图层时,可以对两个图层使用相同的转换对象。 使用相同的过渡对象还可以简化您必须编写的代码。 但是,您可以使用不同的过渡对象,并且如果每个图层的过渡参数都不同,则肯定需要这样做。

为动画添加透视图

应用程序可以在三个空间维度上操纵图层,但为简单起见,Core Animation使用平行投影来显示图层,该投影实际上将场景展平为二维平面。 此默认行为会导致具有相同zPosition值的大小相同的图层显示为相同的大小,即使它们在z轴上相距很远也是如此。 您通常可以从三个维度查看这种场景的透视图已经消失了。 但是,可以通过修改图层的转换矩阵以包括透视图信息来更改该行为。

以下示例显示了层沿y轴旋转的情况。 在这种情况下,自定义eyePosition变量指定沿z轴查看图层的相对距离。 通常,您为eyePosition指定一个正值,以使图层保持预期的方向。 较大的值会导致场景更平坦,而较小的值会导致图层之间更明显的视觉差异。

遮罩属性

您可以使用遮罩遮盖层的全部或部分内容。 遮罩本身就是一个图层对象,其Alpha通道用于确定哪些对象被阻止以及哪些对象被传输。 遮罩层内容的不透明部分允许底层的内容显示出来,而透明部分部分或完全遮盖了底层的内容。 以下示例显示了与蒙版层复合的示例层:

您可以在此处下载最终项目