1、能否响应事件
UIView继承于UIResponder,具有响应事件的功能
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate>
CALayer继承于NSObject,不具有响应时间的功能
@interface CALayer : NSObject <NSSecureCoding, CAMediaTiming>
所以可以理解成UIView用于响应事件,CALayer用于图像绘制。
2、两者关联
2.1、UIView 是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的绘图部 分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等, 实际上内部都是在访问它所包含的CALayer的相关属性。
2.2、UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过
+ (Class)layerClass {
return NEW_LAYER;
}
使某个UIView的子类使用GL来进行绘制。
2.3、UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer。
2.4、UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。
第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。
2.5、UIView的子layer(sublayer),在属性改变的时候,会产生隐式动画,动画时间为0.25s,在动画时间里,系统自动判定哪些属性更改了,自动对更改的属性进行动画插值,生成中间帧然后连续显示产生动画效果。
2.6、坐标系系统,CALayer多了一个anchorPoint(待填坑)。
3、隐式动画
在修改UIView的非主Layer的属性的时候(如2.5所说),会产生一些动画,这些动画就是隐式动画。这些属性,通常包括 bonus, backgroundColor, position等。隐式动画可以手动取消,例如:
[CATransaction begin];
[CATransaction setDisableActions:YES]; // 禁用隐式动画
// 改变layer属性
[CATransaction commit]; // 提交事务