CALayer的能力
CALayer 所具有而UIView没有的功能
- 阴影 圆角 带颜色的边框
- 3D变换
- 非矩形范围
- 透明遮罩
- 多级非线性动画
CALayer寄宿图的各种属性
- contents 属性
这个用来呈现图层的内容,赋值的类型是CGImageRef,这是一个纸箱CGImage结构的指针
layer.contents= (__bridge id)image.CGImage;
contentsGravity
这个是用来设置图层显示的方式,是为了决定内容在图层的边界中怎么对其。类型常量有下面几种
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill
经常使用的属性是 kCAGravityResizeAspectmasksToBounds
用来决定是否显示超出边界的内容,默认值为NOcontentsRect
这个属性允许我们在图层边框里显示寄宿图的一个子域。
contentsRect不是按点来计算的,它使用了单位坐标,0到1之间,是一个相对值。mask
mask是CALayer的一个属性,这个属性返回的是一个CALayer的指针。这个属性的用处是可以使得视图展现一个不规则的边界,这个边界不用drawRect重绘来实现。这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。不同于那些绘制在父图层中的子图层,mask图层定义了父图层的部分可见区域。
mask图层的Color属性是无关紧要的,真正重要的是图层的轮廓。mask属性就像是一个饼干切割机,mask图层实心的部分会被保留下来,其他的则会被抛弃。mask图层的颜色是不会展现出来的,最重要的是mask layer的轮廓。
就是上图,最后合成的图片的轮廓是mask的轮廓,但是内容还是图片原来的内容
隐式动画
单独添加一个图层(CALayer)默认会产生动画
UIView自带的图层(view.layer)之所以没有动画,是因为UIView把隐式动画给禁止了。每个UIView对它关联的图层都扮演了一个委托,并且提供了-actionForLayer:forKey的实现方法。当不在一个动画块的实现中,UIView对所有图层行为返回nil,但是在动画block范围之内,它就返回了一个非空值。
- UIView关联的图层禁用了隐式动画,对这种图层做动画的唯一办法就是使用UIView的动画函数(而不是依赖CATransaction),或者继承UIView,并覆盖-actionForLayer:forKey:方法,或者直接创建一个显式动画
- 对于单独存在的图层,我们可以通过实现图层的-actionForLayer:forKey:委托方法,或者提供一个actions字典来控制隐式动画(或者使用显示动画)
防射变换
CGAffineTransform 中的“防射”的意思是无论变换矩阵用什么值,图形中平行的两条线在变换之仍然保持平行
呈现与外观
呈现图层 (presentationLayer)这个呈现图层实际上是模型图层的复制,但是它的属性值代表了在任何指定时刻当前外观效果。换句话说,你可以通过呈现图层的值来获取当前屏幕上真正显示出来的,我的理解就是在动画执行的每个时间点上图层。
当你改变一个图层的属性,属性值的确是立刻更新的(如果你读取它的数据,你会发现它的值在你设置它的那一刻就已经生效了),但是屏幕上并没有马上发生改变。这是因为你设置的属性并没有直接调整图层的外观,相反,他只是定义了图层动画结束之后将要变化的外观。