美文网首页
Core Animation基础

Core Animation基础

作者: 浪呀么浪打浪 | 来源:发表于2020-07-08 20:26 被阅读0次

    Core Animation基础

    Core Animation提供了一种通用系统,可对应用程序的视图和其他视觉元素进行动画处理。Core Animation不能替代您的应用视图。相反,它是一种与视图集成在一起的技术,可以提供更好的性能和动画效果。它通过将视图的内容缓存到可以由图形硬件直接操作的位图中来实现此行为。在某些情况下,这种缓存行为可能需要您重新考虑如何呈现和管理应用程序的内容,但是大多数情况下,您在不知道它存在的情况下使用Core Animation。除了缓存视图内容之外,Core Animation还定义了一种方法,该方法可以指定任意视觉内容,将该内容与视图集成以及将其与其他所有内容一起设置为动画。

    您可以使用Core Animation为应用程序的视图和视觉对象进行动画更改。大多数更改与修改视觉对象的属性有关。例如,您可以使用“核心动画”为视图的位置,大小或不透明度更改动画。进行此类更改时,Core Animation将在属性的当前值和您指定的新值之间进行动画处理。通常,您不会使用Core Animation每秒60次替换视图的内容,例如卡通。而是使用Core Animation在屏幕上移动视图的内容,淡入或淡出该内容,对视图应用任意图形转换或更改视图的其他视觉属性。

    图层提供绘图和动画的基础

    图层对象是在3D空间中组织的2D曲面,并且是您使用Core Animation所做的一切的核心。像视图一样,图层管理有关其表面的几何形状,内容和视觉属性的信息。与视图不同,图层不会定义自己的外观。一层仅管理位图周围的状态信息。位图本身可以是视图绘图本身或您指定的固定图像的结果。因此,您在应用中使用的主要层被视为模型对象,因为它们主要管理数据。这个概念很重要,因为它会影响动画的行为。

    基于图层的绘图模型

    大多数图层不会在您的应用程序中进行任何实际绘制。取而代之的是,一层捕获您的应用程序提供的内容并将其缓存在位图中,有时将其称为后备存储。当您随后更改图层的属性时,您要做的就是更改与图层对象关联的状态信息。当更改触发动画时,Core Animation将图层的位图和状态信息传递给图形硬件,图形硬件将使用新信息进行位图渲染,如图1-1所示。在硬件中处理位图所产生的动画要比在软件中完成的动画快得多。

    图1-1 Core Animation如何绘制内容

    基于图层的绘图由于它操纵静态位图,因此与更传统的基于视图的绘图技术明显不同。对于基于视图的绘图,对视图本身的更改通常会导致调用该视图的drawRect:方法以使用新参数重绘内容。但是以这种方式进行绘制很昂贵,因为它是使用主线程上的CPU完成的。Core Animation通过在硬件中操纵缓存的位图以实现相同或相似的效果来尽可能避免这种开销。

    基于图层的动画

    图层对象的数据和状态信息与该图层内容在屏幕上的可视表示分离。这种解耦为Core Animation提供了一种方法,使其自身插入并动画化从旧状态值到新状态值的变化。例如,更改图层的position属性会使Core Animation将图层从其当前位置移动到新指定的位置。对其他属性的类似更改会导致适当的动画。图1-2说明了可以在图层上执行的几种动画类型。有关触发动画的图层属性的列表,请参见动画属性

    图1-2 可以在图层上执行的动画示例

    在动画过程中,Core Animation用硬件为您完成所有的逐帧绘制。您所要做的就是指定动画的起点和终点,然后让Core Animation完成其余的工作。您还可以根据需要指定自定义时间信息和动画参数。但是,如果没有,Core Animation将提供合适的默认值。

    图层对象定义自己的几何

    图层的一项工作是管理其内容的视觉几何形状。视觉几何包含有关该内容的范围,其在屏幕上的位置以及该图层是否已以任何方式旋转,缩放或变换的信息。就像视图一样,图层具有框架和边界矩形,您可以使用它们来放置图层及其内容。图层还具有视图不具备的其他属性,例如锚点,它定义了进行操作的周围的点。指定图层几何某些方面的方式也不同于为视图指定该信息的方式。

    图层使用两种类型的坐标系

    图层同时使用基于点的坐标系单位坐标系来指定内容的放置。使用哪种坐标系取决于所传达信息的类型。当指定直接映射到屏幕坐标的值或必须相对于另一个图层(例如,该图层的position属性)指定时,使用基于点的坐标。当值不应该绑定到屏幕坐标时,因为它是相对于其他某个值的,所以使用单位坐标。例如,图层的anchorPoint属性指定一个相对于图层本身边界的点,该点可以更改。

    基于点的坐标最常见的用途是指定图层的大小和位置,您可以使用图层的boundsposition属性进行指定。在bounds定义了层本身的坐标系,并且包括在屏幕上的层的大小。该position属性定义图层相对于其父级坐标系的位置。尽管图层具有frame属性,但该属性实际上是从bounds和position属性中的值派生的,因此使用频率较低。

    图层bounds和frame矩形的方向始终与基础平台的默认方向匹配。图1-3显示了iOS和OS X上边界矩形的默认方向。在iOS中,边界矩形的原点默认位于图层的左上角,而在OS X中则位于底部-左上角。如果您在应用程序的iOS版本和OS X版本之间共享核心动画代码,则必须考虑这些差异。

    图1-3 iOS和OS X的默认图层几何

    图1-3中要注意的一件事是,该position属性位于该层的中间。该属性是其定义根据图层anchorPoint属性中的值而更改的几个属性之一。锚点表示某些坐标的起源点,并且在“ 锚点影响几何操作”中有更详细的描述。

    所有坐标值(无论是点坐标还是单位坐标)都指定为浮点数。使用浮点数可让您指定可能位于法线坐标值之间的精确位置。使用浮点值非常方便,尤其是在打印过程中或绘制到可能由多个像素表示一个点的Retina显示器时。浮点值使您可以忽略基础的设备分辨率,而仅以所需的精度指定值。

    锚点影响几何操纵

    图层的几何相关操作相对于该图层的锚点进行,您可以使用图层的anchorPoint属性对其进行访问。操纵图层的position或transform属性时,锚点的影响最明显。始终相对于图层的锚点指定position属性,并且您应用于图层的任何变换也都相对于锚点进行。

    图1-5演示了如何将锚点从其默认值更改为其他值如何影响position图层的属性。即使图层未在其父级边界内移动,将锚点从图层中心移动到图层边界原点也会更改position属性中的值。

    图1-5 锚点如何影响图层的位置属性

    图1-6显示了更改锚点如何影响应用于图层的变换。将旋转变换应用于图层时,旋转会围绕锚点发生。由于锚点默认情况下设置为图层的中间位置,因此通常会创建您期望的旋转行为。但是,如果更改锚点,则旋转的结果会有所不同。

    图1-6 锚点如何影响图层转换

    可以在三个维度上操纵图层

    可以在三个维度上操纵图层

    每个图层都有两个变换矩阵,可用于操纵该图层及其内容。transform属性CALayer指定要同时应用于图层及其嵌入的子图层的变换。通常,当您要修改图层本身时,可以使用此属性。例如,您可以使用该属性缩放或旋转图层或临时更改其位置。该sublayerTransform属性定义仅适用于子层的其他转换,并且最常用于为场景内容添加透视视觉效果。

    变换的工作方式是将坐标值乘以一个数字矩阵,以获得表示原始点的变换版本的新坐标。由于可以在三个维度上指定“核心动画”值,因此每个坐标点具有四个值,必须将这些值乘以四乘四矩阵,如图1-7所示。在Core Animation中,图中的变换由CATransform3D类型。幸运的是,您不必直接修改此结构的字段即可执行标准转换。Core Animation提供了一组全面的功能,用于创建比例尺,平移和旋转矩阵以及进行矩阵比较。除了使用函数来操纵变换之外,Core Animation还扩展了键值编码支持,使您可以使用键路径修改变换。有关可以修改的关键路径的列表,请参阅CATransform3D关键路径

    图1-7 使用矩阵数学转换坐标

    图1-8显示了您可以进行的一些更常见转换的矩阵配置。将任何坐标乘以恒等变换将返回完全相同的坐标。对于其他转换,如何修改坐标完全取决于您更改的矩阵成分。例如,仅沿x轴平移,您将为tx平移矩阵的分量提供一个非零值,并将ty和tz值保留为0。对于旋转,您将提供目标旋转角度的适当正弦和余弦值。

    图1-8 常见转换的矩阵配置

    有关用于创建和处理变换的功能的信息,请参见《核心动画功能参考》

    层树反映了动画状态的不同方面

    使用Core Animation的应用程序具有三组图层对象。在使您的应用程序内容显示在屏幕上时,每组图层对象都有不同的作用:

    在对象模型层树(或简称“层树”)是最的那些您的应用程序进行交互。该树中的对象是存储任何动画的目标值的模型对象。每当您更改图层的属性时,都将使用这些对象之一。

    演示文稿树中的对象包含任何正在运行的动画的运行中值。图层树对象包含动画的目标值,而表示树中的对象则反映屏幕上显示的当前值。您永远不要修改此树中的对象。相反,您可以使用这些对象读取当前动画值,也许可以从这些值开始创建新动画。

    渲染树中的对象执行实际的动画,并且是Core Animation专有的。

    每一组图层对象都组织成一个层次结构,例如您应用程序中的视图。实际上,对于为所有视图启用图层的应用程序,每棵树的初始结构都与视图层次结构完全匹配。但是,应用程序可以根据需要将其他图层对象(即不与视图关联的图层)添加到图层层次结构中。您可以在某些情况下执行此操作,以针对不需要视图所有开销的内容优化应用程序的性能。图1-9显示了在简单的iOS应用程序中发现的图层细分。示例中的窗口包含一个内容视图,该内容视图本身包含一个按钮视图和两个独立的图层对象。每个视图都有一个对应的图层对象,该对象构成图层层次结构的一部分。

    图1-9 与窗口关联的图层

    对于图层树中的每个对象,表示和渲染树中都有一个匹配的对象,如图1-10所示。如前所述,应用程序主要与图层树中的对象一起使用,但有时可能会访问表示树中的对象。具体来说,访问presentationLayer层树中对象的属性将返回表示树中的相应对象。您可能要访问该对象以读取动画中间属性的当前值。

    图1-10 窗口的层树

    重要提示: 仅在播放动画时,才应访问演示树中的对象。在动画制作过程中,表示树包含该值在那一刻显示在屏幕上的层值。此行为与图层树不同,后者总是反映您的代码设置的最后一个值,并且等同于动画的最终状态。

    图层与视图之间的关系

    图层不能替代您的应用程序视图-也就是说,您不能仅基于图层对象创建可视界面。图层为您的视图提供基础结构。具体来说,图层使绘制和动画化视图内容并使之保持动画状态并保持较高的帧速率变得更加轻松有效。但是,很多事情是图层无法做到的。图层不处理事件,绘制内容,参与响应者链或执行许多其他操作。因此,每个应用程序仍必须具有一个或多个视图来处理这些类型的交互。

    在iOS中,每个视图都有相应的图层对象支持,但是在OS X中,您必须确定哪些视图应具有图层。在OS X v10.8及更高版本中,将层添加到所有视图中可能是有意义的。但是,您不需要这样做,并且在不需要和不需要开销的情况下仍可以禁用图层。分层确实会增加您的应用程序的内存开销,但是它们的好处通常大于缺点,因此,始终最好在禁用层支持之前测试应用程序的性能。

    在为视图启用图层支持时,您将创建称为图层支持的视图。在层支持的视图中,系统负责创建基础层对象,并使该层与视图保持同步。所有iOS视图都是基于图层的,并且OS X中的大多数视图也是。但是,在OS X中,您还可以创建一个图层托管视图,该视图是您自己提供图层对象的视图。对于图层托管视图,AppKit采取了一种管理图层的自动方法,并且不根据视图更改对其进行修改。

    注意: 对于支持图层的视图,建议您尽可能操作视图,而不是其图层。在iOS中,视图只是图层对象的薄薄包装,因此您对图层进行的任何操作通常都可以正常工作。但是在iOS和OS X中都存在这样的情况,即操作图层而不是视图可能无法产生所需的结果。本文档将尽可能指出这些陷阱,并尝试提供方法来帮助您解决这些陷阱。

    除了与视图关联的图层之外,您还可以创建没有对应视图的图层对象。您可以将这些独立的图层对象嵌入到应用程序中的任何其他图层对象中,包括与视图关联的对象。通常,您将独立的图层对象用作特定优化路径的一部分。例如,如果要在多个位置使用同一图像,则可以加载一次图像并将其与多个独立的图层对象关联,然后将这些对象添加到图层树中。然后,每个层都引用源映像,而不是尝试在内存中创建该映像的自己的副本。

    相关文章

      网友评论

          本文标题:Core Animation基础

          本文链接:https://www.haomeiwen.com/subject/ugnwnctx.html