iOS-Core-Animation-Advanced-Techniques(一)总结

CALayer的寄宿图(即图层中包含的图)

CALayer 属性

1.contents:

layer.contents = (__bridge id)image.CGImage;

2.contentGravity:

同UIView contentMode

contentsGravity的目的是为了决定内容在图层的边界中怎么对齐

3.contentsScale

contentsScale属性其实属于支持高分辨率(又称Hi-DPI或Retina)屏幕机制的一部分。它用来判断在绘制图层的时候应该为寄宿图创建的空间大小,和需要显示的图片的拉伸度(假设并没有设置contentsGravity属性)。

4.maskToBounds

同UIView clipsToBounds

决定是否显示超出边界的内容

5.contentsRect

默认的contentsRect是{0, 0, 1, 1},这意味着整个寄宿图默认都是可见的,如果我们指定一个小一点的矩形,图片就会被裁剪(如图2.6)

常用于拼合图片

6.contentsCenter

类似 UIImage resizableImageWithCapInsets

用Interface Builder 探测窗口控制contentsCenter属性

contentsCenter其实是一个CGRect,它定义了一个固定的边框和一个在图层上可拉伸的区域

 

Custome Drawing

给contents赋CGImage的值不是唯一的设置寄宿图的方法。我们也可以直接用Core Graphics直接绘制寄宿图。能够通过继承UIView并实现-drawRect:方法来自定义绘制。

 -drawRect

如果你不需要寄宿图,那就不要创建这个方法了,这会造成CPU资源和内存的浪费

当需要被重绘时,CALayer会请求它的代理给他一个寄宿图来显示。它通过调用下面这个方法做到的:

1
(void)displayLayer:(CALayerCALayer *)layer;

趁着这个机会,如果代理想直接设置contents属性的话,它就可以这么做,不然没有别的方法可以调用了。如果代理不实现-displayLayer:方法,CALayer就会转而尝试调用下面这个方法:

1
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;

在调用这个方法之前,CALayer创建了一个合适尺寸的空寄宿图(尺寸由bounds和contentsScale决定)和一个Core Graphics的绘制上下文环境,为绘制寄宿图做准备,他作为ctx参数传入。

不同于UIView,当图层显示在屏幕上时,CALayer不会自动重绘它的内容。它把重绘的决定权交给了开发者,需要显式地调用了-display。

尽管我们没有用masksToBounds属性,绘制的那个圆仍然沿边界被裁剪了。这是因为当你使用CALayerDelegate绘制寄宿图的时候,并没有对超出边界外的内容提供绘制支持。

当UIView创建了它的宿主图层时,它就会自动地把图层的delegate设置为它自己

UIView和CALayer的坐标系

视图的frame,bounds和center属性仅仅是存取方法,当操纵视图的frame,实际上是在改变位于视图下方CALayer的frame,不能够独立于图层之外改变视图的frame。

对于视图或者图层来说,frame并不是一个非常清晰的属性,它其实是一个虚拟属性,是根据bounds,position和transform计算而来,所以当其中任何一个值发生改变,frame都会变化。相反,改变frame的值同样会影响到他们当中的值

记住当对图层做变换的时候,比如旋转或者缩放,frame实际上代表了覆盖在图层旋转之后的整个轴对齐的矩形区域,也就是说frame的宽高可能和bounds的宽高不再一致了。

默认来说,anchorPoint位于图层的中点,所以图层的将会以这个点为中心放置。anchorPoint属性并没有被UIView接口暴露出来,这也是视图的position属性被叫做“center”的原因。

CALayer给不同坐标系之间的图层转换提供了一些工具类方法:

1
2
3
4
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer; 
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer; 
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;

这些方法可以把定义在一个图层坐标系下的点或者矩形转换成另一个图层坐标系下的点或者矩形

geometryFlipped

它决定了一个图层的坐标是否相对于父图层垂直翻转

CALayer还有另外两个属性,zPosition和anchorPointZ,二者都是在Z轴上描述图层位置的浮点类型。

zPosition最实用的功能就是改变图层的显示顺序。

zPosition属性可以明显改变屏幕上图层的顺序,但不能改变事件传递的顺序。

原文地址:https://www.cnblogs.com/iOSJason/p/4349854.html