话说UIView和CALayer区别

单一职责原则

1. UIView可以响应事件

UIKit中使用UIResponder作为响应对象,来响应传递过来的事件,并进行处理
UIApplication、UIViewController、UIView 和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。
UIResponder 处理各种事件,里面实现了包括触摸事件(Touch Event)、运动事件(Motion Event)和远程控制事件

2. CALayer继承自NSObject,不能响应事件

1.UIView是[iOS]系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由Core Animation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。
UIView为CALayer提供内容,UIView是layer的代理,以及负责处理触摸等事件,参与响应链

2.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。

3.UIView的layer树形在系统内部,被维护着三份copy。分别是
逻辑树,这里是代码可以操纵的;
动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;
显示树,其内容就是当前正被显示在屏幕上得内容。

4.动画的运作:
对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。

5.坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性。

6.layer可以设置圆角显示(cornerRadius),也可以设置阴影 (shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影.....
layer重新渲染,当各个层绘制准备好后,setNeedsDisplay方法来重绘显示。

7.CALayer属性值变化,会自动产生一个动画效果,缺省时间是0.25s(也有说是0.5s),这个就是隐式动画,但是直接修改UIView的就不会,是因为UIView默认禁止了layer动画,但是在 animation block 中又重新启用了它们,是因为任何可动画的 layer 属性改变时,layer 都会寻找并运行合适的 'action' 来实行这个改变。

你可能感兴趣的:(话说UIView和CALayer区别)