view和layer知识点整理

语言: CN / TW / HK

view和layer的区别\ view和layer最主要的区别是view可以处理事件,layer不可以\ 每一个view都有一个layer属性,该属性的类型是CALayer,它是管理着view界面的绘制,而这个view是layer的delegate。\ \ view依赖于layer来绘制界面,当然很多的属性view都是直接返回layer的,比如frame是直接返回的layer的frame,而layer的frame是由它的anchorPoint,position,bounds,和 transform共同决定的\ \ 总接来说就是如下几点:\ \ ●不同继承关系:CALayer 继承自 NSObject,UIView 由于要负责交互事件,所以继承自 UIResponder。\ ●每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint\ ●在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display\ ●CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)\ ●layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer\ ●两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以\ ●layer有很多种,比如 CAShapeLayer、CAScrollLayer、AVCaptureVideoPreviewLayer ... 这些都继承自CALayer,CALayer继承NSObject\ ●CALayer 是 UIView 的属性之一,负责渲染和动画,提供可视内容的呈现。\ \ 为什么要将 CALayer 独立出来,直接使用 UIView 统一管理不行吗?为什么不用一个统一的对象来处理所有事情呢?\ 单一原则(职责分离,拆分功能,方便代码的复用)View 负责交互 时间传递。Layer 负责绘制 通过 Core Animation 框架来负责可视内容的呈现,这样在 iOS 和 OS X 上都可以使用 Core Animation 进行渲染。与此同时,两个系统还可以根据交互规则的不同来进一步封装统一的控件,比如 iOS 有 UIKit 和 UIView,OS X 则是AppKit 和 NSView。\ \ 有了这两个最关键的根本关系,那么下面这些经常出现在面试答案里的显性的异同就很好解释了。举几个例子:\ ●相同的层级结构:我们对 UIView 的层级结构非常熟悉,由于每个 UIView 都对应 CALayer 负责页面的绘制,所以 CALayer 也具有相应的层级结构。\ ●部分效果的设置:因为 UIView 只对 CALayer 的部分功能进行了封装,而另一部分如圆角、阴影、边框等特效都需要通过调用 layer 属性来设置。\ ●是否响应点击事件:CALayer 不负责点击事件,所以不响应点击事件,而 UIView 会响应。\ ●不同继承关系:CALayer 继承自 NSObject,UIView 由于要负责交互事件,所以继承自 UIResponder。\ 当然还剩最后一个问题,\ 这样设计的主要原因就是为了职责分离,拆分功能,方便代码的复用。