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。
当然还剩最终一个问题,
这样设计的主要原因便是为了责任别离,拆分功用,便利代码的复用。