一、Response
UIView 可以响应事件,Layer 不可以
- UIKit 使用 UIResponder 作为响应对象,定义了处理各种事件和事件传递的接口。UIApplication/UIViewController/UIView/其他 UIView 派生出来的 UIKit 类
- CALayer 直接继承 NSObject,没有相应的处理事件的接口
二、Struct
一个 Layer 的 frame 是由它的 anchorPoint、position、bounds、transform 共同决定的,而一个 view 的 frame 只是简单地返回 Layer 的 frame,同样 view 的 center 和 bounds 也是返回 Layer 的一些属性
CALayer 的常用属性
-
anchorPoint 和中心点 position 重合的一个点,称为 “锚点”。锚点的描述是相对于 x/y 位置比例而言的默认在(0.5, 0.5)的位置,也就是中心点
layer 的默认 anchorPoint (0.5, 0.5)居中,此时 layer 的 position 为 anchorPoint 的位置;
anchorPoint 表示的是锚点处于 layer 的位置
- content 图层显示内容,例如可以将图片作为图层内容使用
- frame 图层的大小和位置,不支持隐式动画,所以在 CALayer 中很少使用 frame,通常使用 bounds 和 position 代替
- opacity 透明度,类似于 UIView 的 alpha
- shadow 三个属性: shadowColor、shadowOffset、shadowOpacity
三、Function
- UIView 主要是对显示内容的管理,CALayer 侧重于对显示内容的绘制
- 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部 Layer 提供。两者都由树状层级结构,layer 内部有 sublayers,view 内部有 subviews,但是 Layer 比 View 多了一个 anchorPoint
四、Animation
- CALayer 是默认修改属性支持隐式动画的,修改非 RootLayer 的属性(位置、背景颜色等等)会默认产生隐式动画,而修改 UIView 不会
- 在给 View 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过
actionForLayer:forKey:
向 View请求相应的 action(动画行为)
layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树),Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer 的属性值,而最终展示在界面上的其实是提供 View 的 modelLayer
网友评论