iOS-UIView与CALayer关系

iOS开发中UIView和CALayer有大部分功能是相似的,基本上UIView能支持的功能CALayer也支持.iOS之所以有两套并行的树形结构,是因为iOS与Mac OS之间有很大不同,触摸实现的方式和鼠标键盘的用户交互方式有本质的不同.iOS用UIKit和UIView,而Mac OS用AppKit和NSView进行视图绘制,布局和动画,中间的公共逻辑抽取之后形成了核心动画框架.CALayer作为视图布局的公共部分,更能做到划分清楚责任,避免重复代码.

UIView和CALayer关系:

1.事件响应:UIView可以响应触摸事件,CALayer不可以.UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理.UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类.在 UIResponder中定义了处理各种事件和事件传递的接口, 而 CALayer直接继承 NSObject,并没有相应的处理事件的接口.

2.坐标:UIView坐标通过frame,bounds来显示,最终也是通过CALayer来控制.但是CALayer可以通过position与anchorPoint计算位置.

3.动画:UIView本身是由CoreAnimation来实现的.CALayer类来管理实际绘图.CALayer 内部维护着三分 layer tree,分别是 presentLayer Tree(显示树),modeLayer Tree(模型树), Render Tree (渲染树).iOS动画修改的的动画属性,实际上是修改presentLayer的属性值,而最终展示在界面上的是modelLayer.

4.渲染:当更新CALayer视图层,改变不能立即显示在屏幕上.当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示.

view.layer.setNeedsDisplay()

5.变换与变形:CALayer层可以添加3D或仿射变换,可以分别设置层的transform或affineTransform属性.CATransform3D的数据结构定义了一个同质的三维变换(4x4 CGFloat值的矩阵,用于图层的旋转,缩放,偏移,歪斜和应用的透视.

        view.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0)
        
        let transform:CGAffineTransform = CGAffineTransform(rotationAngle: 45.0);
        view.layer.setAffineTransform(transform)

你可能感兴趣的:(iOS-UIView与CALayer关系)