一、 图层与视图

  1. iOS视图的定义:

    • 一个视图就是在屏幕上显示的一个矩形块(比如图片,文字或者视频),它能够拦截类似于鼠标点击或者触摸手势等用户输入(屏幕可见)

    • 视图在层级关系中可以互相嵌套,一个视图可以管理它的所有子视图的位置(嵌套关系)

    • 在iOS当中,所有的视图都从一个叫做UIVIew的基类派生而来:

      1.1. UIView可以处理触摸事件

      1.2. 可以支持基于Core Graphics绘图

      1.3. 可以做仿射变换(例如旋转或者缩放)

      1.4. 或者简单的类似于滑动或者渐变的动画

  2. iOS中的图层:

    • CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块
    • 也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置
    • 有一些方法和属性用来做动画和变换
    • UIView最大的不同是CALayer不处理用户的交互!!!
  3. 平行的层级关系

    • 每一个UIview都有一个CALayer实例的图层属性
    • 视图的职责就是创建并管理这个图层:以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作!
    • 实际上这些背后关联的图层才是真正用来在 屏幕上显示和做动画 ,UIView仅仅是对它的一个封装,提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口!!

    思考:为什么iOS要基于UIViewCALayer提供两个平行的层级关系呢?为什么不用一个简单的层级来处理所有事情呢?

    原因在于要做职责分离,这样也能避免很多重复代码。

    在iOS和Mac OS两个平台上,事件和用户交互有很多地方的不同,基于多点触控的用户界面和基于鼠标键盘有着本质的区别,这就是为什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因

    注:实际的4种层级关系: 实际上,这里并不是两个层级关系,而是四个,每一个都扮演不同的角色

    • 视图层级
    • 图层树
    • 呈现树—-隐式动画
    • 渲染树—-性能调优

二、图层的能力

思考:CALayerUIView内部实现细节,且苹果为我们提供了优美简洁的UIView接口,在此情况下,为什么还要了解和使用图层树layer?—— 复杂场景下的进阶需要

我们确实没必要处理CALayer,因为苹果已经通过UIView的高级API间接地使得动画变得很简单, 但是这种简单会不可避免地带来一些灵活上的缺陷;

略微想在底层做一些改变,或者使用一些苹果没有在UIView上实现的接口功能,这时除了介入Core Animation底层之外别无选择

UIView没有暴露出来的CALayer的功能:

  • 阴影shadow,圆角connerRudis,带颜色borderColor的边框
  • 3D变换
  • 非矩形范围
  • 透明遮罩
  • 多级非线性动画

三、使用图层

Layer的创建于添加:

1
2
3
4
5
6
//create sublayer
CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
blueLayer.backgroundColor = [UIColor blueColor].CGColor;
//add it to our view
[self.layerView.layer addSublayer:blueLayer];

一个视图只有一个相关联的图层(自动创建),同时它也可以支持添加无数多个子图层;

尽管可以这样添加图层,但往往我们只是简单地处理视图,他们关联的图层并不需要额外地手动添加子图层。

推荐使用CALayer而不是UIView的情况:

  • 开发同时可以在Mac OS上运行的跨平台应用
  • 使用多种CALayer的子类,并且不想创建额外的UIView去包封装它们所有
  • 做一些对性能特别挑剔的工作

四 、总结

阐述了图层的树状结构,说明了如何在iOS中由UIView的层级关系形成的一种平行的CALayer层级关系