图层

深知苹果的动画是世界一流的,因此从本篇文章开始,将陆续发出iOS有关的图层与动画相关的学习总结。
目录

1. Core Animation

   Core Animation的前身是Layer Kit。本身并不是真正做动画的,下面看看官方提供的Core Animation在框架中的结构位置:


   虽然名称给人的感觉是做动画的,其实Core Animation是一个用于管理视图排版,合成,渲染,动画等的一个基础的framework。其底层是openGL和CG框架。关于Core Animation的视图方面,主要是其核心成员CALayer,这个稍后会简单介绍一下。后续会专门介绍它。
了解完这个, 再看看Core Animation的继承树:

(好家伙, 官网这个图有问题, 我P了一下)

先来简单介绍一下:

  • CAAnimation是核心动画的基类, 不能直接使用, 主要负责动画的时间, 速度等, 本身实现了CAMediaTiming协议。

  • CAMediaTiming协议定义了动画的时间系统.

  • CAPropertyAnimation顾名思义就是属性动画, 继承自CAAnimation,不能直接使用,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation

  • CABasicAnimation, 继承自属性动画, 主要用于制作比较单一的动画,例如,平移、缩放、旋转、颜色渐变、边框的值的变化等,也就是将layer的某个属性值从一个值到另一个值的变化.它还有一个子类是CASpringAnimation,是苹果新加入用于弹簧动画的.

  • CAKeyframeAnimation关键帧对话, 允许以线性或非线性的方式设置一组目标值的动画。关键帧动画由一组目标数据值和每个值到达的时间组成。

2. 图层与视图

说完上面的Core Animation后,来说一说图层。

2.1 视图

   在iOS中,所有的视图都是从UIView中继承而来,包含我们自己自定义的视图。首先来看看UIView的继承关系图。
在这里插入图片描述

2.2 CALayer

   UIView中有一个CALayer的对象,平时为了处理阴影,圆角的时候,我们会和该对象打交道。
   看到CALayer的前缀可以联想到前一节说的 Core Animation。
UIView实则是封装了CALyer,CALayer是真正用来显示图像和实现动画的。而接受用户操作行为和图层的管理交给UIView,显示图像交给CALayer。
之所以实现一个单独的CALayer,是因为除了iOS平台,还有OS X平台也可以使用代码来显示图像。
   后面我们会见到封装的某些对应的接口,如:

CALayer:makeToBounds
UIView:clipsToBounds

2.3 图层的能力

在这里插入图片描述

2.4 图层的使用

2.4.1 简单使用

如果仅仅改变某几个简单分属性,只需要改变该UIView的layer中属性就可以,例如:

view.layer.xxx

xxx这是上一小节列出的属性。

2.4.2 子图层

我们知道UIView中,视图的图层是通过添加子视图来实现的:

- (void)addSubView:(UIView *)view;

同样的,对于CALayer也有一个类似的API来添加子图层:

- (void)addSublayer:(CALayer *)layer;
2.4.3 自定义子图层

   在我们要使用一个关于相机的controller的时候,会使用相机会提供一个预览图层:AVCaptureVideoPreviewLayer。这其实也是一个CALayer,我们需要将这个layer添加到子图层上,并且需要设置同步session。但是出了添加这个方法,还是可以使用UIView的一个类方法:

+ (Class)layerClass;

   每一个UIView都是寄宿在一个CALayer的示例上。这个图层是由视图自动创建和管理的,那我们可以用别的图层类型替代它么?一旦被创建,我们就无法代替这个图层了。但是如果我们继承了UIView,那我们就可以重写+layerClass方法使得在创建的时候能返回一个不同的图层子类。UIView会在初始化的时候调用+layerClass方法,然后用它的返回类型来创建宿主图层。

2.4.4 总结

最后总结一下,使用图层和UIView的时机:

使用UIView

使用图层关联的视图而不是CALayer的好处在于,你能在使用所有CALayer底层特性的同时,也可以使用UIView的高级API(比如自动排版,布局和事件处理)

  1. 使用CALayer

当满足以下条件的时候,你可能更需要使用CALayer而不是UIView:
开发同时可以在Mac OS上运行的跨平台应用
使用多种CALayer的子类,并且不想创建额外的UIView去包封装它们所有。
做一些对性能特别挑剔的工作,比如对UIView一些可忽略不计的操作都会引起显著的不同。
总的来说,处理视图会比单独处理图层更加方便。

3. 总结

在其他资料中,我们可以见到图层树,呈现树,渲染树等。这里统一说一下我的理解。

图层树:代码中我们所建立的图层之间的父子关系
呈现树:当前呈现的图层。这个主要是在使用属性动画的时候,更改了图层的属性,但是图层树已经改变,但是当前呈现树还没有改变,后面会有关于呈现树的接口介绍。
渲染树:iOS中,应用进程会将图像数据通过IPC,发送到专门渲染图像的进程。这个时候就是渲染树。

本篇文章只是作为引入而写的。后面则是关于图层的属性、专用图层、动画以及相关的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值