戳我
戳我
文章目录
  1. UIView系列之—UIView和CALayer
    1. UIView和CALayer

UIView系列之---UIView和CALayer

UIView系列之—UIView和CALayer

UIView系列之—UIView和CALayer
UIView系列之—UIView的常见layout方法
UIView系列之—iOS的动态高度
UIView系列之—如何写一个自定义View

UIView和CALayer

  1. UIView继承自UIResponder, 可以相应触摸事件. 而CALayer继承自NSObject, 不能响应触摸.

  2. UIView主要是对显示内容的管理, 而CALayer则主要侧重显示内容的绘制. 访问UIVIew的与绘图和跟坐标有关的属性, 例如frame, bounds等, 实际上内部都是在访问它所包含的CALayer的相关属性. UIViewframe实际是layerframe, center, bounds实际也是只是内部layer相对应属性的getset方法, 当你改变一个viewframe的时候, 你其实改变的是内部layerframe. CALayer的frame由anchorPoint, position, bounds, transform共同决定. UIView的创建, 实际上是一系列UILayer创建的过程.

  3. UIView有个重要属性layer. 可以返回它的主CALayer实例. 所有从UIView继承来的对象都继承了这个属性. 这意味着你可以在所有的UIVIew子类上增加动画, 旋转, 缩放等CALayer支持的操作. UIViewlayerClass方法, 可以返回主layer所使用的类, UIView的子类可以通过重载这个方法, 来让UIView使用不同的CALayer来显示. 代码示例:

     - (class)layerClass {
         return ([CAEAGLLayer class]);
     }
    
  4. UIView的主CALayer是类似于subviews的树形结构, 我们可以通过给主layer添加子layer来完成特殊的绘制效果.

    view上添加一个黑色透明layer层的示例代码:

     grayCover = [[CALayer alloc] init];
     grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
     [self.layer addSubLayer:grayCover];
    
  5. UIView的内部, 有三个layer tree: 1.逻辑树, 这里是代码可以操纵的. 2.动画树, 是一个中间层, 系统就在这一层上通过逻辑树来更改属性, 进行各种渲染操作. 3.显示树, 其内容就是当前正被显示在屏幕上得内容.

  6. UIView实际上是CALayerCALayerDelegate, 通过实现一系列的代理方法来显示CALayer绘制的内容.

  7. 在做 iOS 动画的时候, 修改非RootLayer的属性(譬如位置, 背景色等)会默认产生隐式动画, 而修改UIView则不会.

  8. layer可以设置圆角显示(cornerRadius), 也可以设置阴影(shadowColor). 但是如果layer树中某个layer设置了圆角, 树种所有layer的阴影效果都将不显示了. 因此若是要有圆角又要阴影, 变通方法只能做两个重叠的UIView, 一个的layer显示圆角, 一个layer显示阴影.

  9. UIViewUIKit框架下的(只能iOS使用). CALayerQuartzCore的(iOS 和macOS通用).

  10. QuartzCore的渲染能力. 使二维图像可以被自由操纵, 就好像是三维的. 图像可以在一个三维坐标系中以任意角度被旋转, 缩放和倾斜. CATransform3D的一套方法提供了一些魔术般的变换效果.


参考资料:

1.详解CALayer 和 UIView的区别和联系

2.UIView和CALayer的区别