UIView和CALayer

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]; // 提交事务

引用链接
UIView与CALayer的区别,很详细
UIView 和CALayer的区别详解 隐式动画

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。