CALayer

UIView 作为 iOS 的 UI 最基础的界面显示,CALayer 是 UIView 的一个关键属性,在Apple Documentation给出的定义是

An object that manages image-based content and allows you to perform animations on that content.

翻译成中文就是管理基于图像内容的对象,且允许对此对象执行动画

总览

一般来说,layer是用来存储 Views 的后备数据,但 layer 本身也可以脱离 View 而独立使用。Layer 的主要作用是管理视觉内容,但 layer 本身就有一些可被设置的视觉属性,例如背景色 (background color),边框 (border) 和 阴影 (shadow)。除此之外,layer 还包括一些几何信息可在屏幕上显示的信息,例如位置 (position),大小 (size) 和变换 (transform)。

如果 layer 对象是由 View 创建的话,View 自己会自动将自己赋入 layer 的代理 (delegate),但对于自己创建的 layer,可以自己选择赋入的代理 View,可以动态绑定。

和 UIView 的关系

看完总览肯定有人觉得奇怪,既然 layer 管理了 UIView 的视觉内容,干嘛还要分开管理,为什么不把 layer 和 View 合二为一,用 layer 或者 View 来处理所有的事件呢?

  • 职责不同UIView 负责响应事件,Layer 负责渲染界面,单独把 layer 分出来就是为了处理仅渲染界面的情况UIView 和其他由 UIView 派生出来的类都继承自 UIResponder, 在 UIResponder 中定义了处理各种事件的和事件传递的接口,详情可看我之前关于 iOS 相应链的文章(链接),而 CALayer 则是直接继承自 NSObject,不会对事件进行处理。
  • 分工不同除此之外,UIView 主要针对显示内容的管理,而 CALayer 则侧重于显示内容的绘制也因此,在做 iOS 动画的时候,修改非 RootLayer 的属性(位置和背景色等)会默认产生隐式动画,而修改 UIView 则不会
  • 内部结构不同Layer 内部维护三部分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树),Render Tree (渲染树)。

Mask

mask, 即遮罩,是一个可选的layer,他的 Alpha 通道值用于遮盖 layer 的内容

可以通过 mask.content 来处理,在 content 中设置相关参数,从而实现遮罩的效果

除此之外,还可以通过 CAShapeLayer 来画出遮罩的类型

引用

https://developer.apple.com/documentation/quartzcore/calayer
http://www.cocoachina.com/articles/13244
https://zsisme.gitbooks.io/ios-/content/index.html

发表评论

邮箱地址不会被公开。 必填项已用*标注