1. UIView/CALayer
1> 两者的关系?
每一个UIView都对应一个CALayer,UIView是对CALayer的封装,提供了对应的api接口;CALayer不响应用户的点击
2> 为何分两层?
方便ios和mac os代码共享,两者点击操作不同,分别通过UIView、NSView来响应点击操作
3> Core Animation:layer trees
1) 图层树:model layer tree,简称layer tree:保存了整个视图层级中的所有layer对象
2) 呈现树:presentation tree:保存了当前动画中间过程的状态
3) 渲染树:render tree:负责实际渲染到屏幕
4> 什么时候需要一定对CALayer进行操作?
使用CALayer的子类、mask
5> CALayer 相关属性
contents、contentsRect(拼接,注意单位)、contentsScale、contentGravity(拉伸)
-drawRect:方法里面的代码利用Core Graphics去绘制一个寄宿图,然后内容就会被缓存起来直到它需要被更新;虽然UIView方法,但其实是CALayer做了重绘,并保存了图片,
给contents赋CGImage的值不是唯一的设置寄宿图的方法。我们也可以直接用Core Graphics直接绘制寄宿图。能够通过继承UIView并实现-drawRect:方法来自定义绘制。如果UIView检测到-drawRect: 方法被调用了,它就会为视图分配一个寄宿图,这个寄宿图的像素尺寸等于视图大小乘以 contentsScale的值。如果你不需要寄宿图,那就不要创建这个方法了,这会造成CPU资源和内存的浪费,这也是为什么苹果建议:如果没有自定义绘制的任务就不要在子类中写一个空的-drawRect:方法。
6> frame bounds anchorPoint
frame针对父view bounds是内部坐标,在做变换:比如旋转时 frame是变化的
7> 阴影
为何阴影会消耗性能?阴影路径是根据图层内容计算出来的
8> transform
UIView.transform:仿射变换 对应CALayer.affineTransform;
CALayer.transform:3D变换,需要增加透视效果:通过设置m34为-1.0 / d来应用透视效果,d代表了想象中视角相机和屏幕之间的距离,以像素为单位,通常500-1000
旋转180°,看到的是镜像图片。如果希望图层背面不绘制,则设置CALayer.doubleSided=NO;