老早就知道了这本书,可惜国内只有英文版的。而本人对于自己的英文水平还是有点自知之明的,就算硬着头皮从亚马逊上买来看,估计也只能起催眠书籍的作用了。还好在GitHub上看到了这本书籍的翻译项目,虽然说是大伙合作翻译来的,不过对于我来说还是求之不得的了,给上项目地址。这里会就自己读书过程中的体会做一个笔记,希望整本书读完后会有一个全新的认识。
没读这本书之前,我对UIView与CALayer的理解还是很抽像的:UIView是对CALayer的上层封装,主要负责处理与用户触摸输入有关的逻辑,而CALayer主要负责控件的具体绘制过程,但具体到细节,就不甚了解了。那接下我们这来了解一些细节吧。
frame与bounds
我们知道UIView有frame与bounds两个属性,frame表示View相对于其父View坐标系所在的位置,而bounds是相对于其自身坐标系。但当我们对图层作变换时,如旋转或缩放,frame实际上代表了覆盖在图层旋转之后的整个轴对齐的矩形区域。也就是说frame的宽高与bounds的宽高可能就不在一致了,如下图:autoresize
我们对UIView可以使用UIViewAutoresizingMask或者NSLayoutConstraint来实现自动布局功能。但对于CALayer,我们只能手动的来处理了,最简单的实现方式是实现CALayerDelegate中以下接口了:
- (void)layoutSublayersOfLayer:(CALayer *)layer;
这也是为什么最好使用视图而不是单独的图层来构建应用程序的重要原因之一。
视觉效果
UIView上的圆角、边框、阴影等效果实际上就是通过CALayer来实现的,参考代码如下:
//设置layerView显示圆角
self.layerView.layer.masksToBounds = YES;
//设置圆角曲律
self.layerView.layer.cornerRadius=4.0f;
//边框宽度
self.layerView.layer.borderWidth = 1.0f;
//边框颜色
self.layerView.layer.borderColor = (__bridge id)[UIColor redColor].CGColor;
//阴影方向与距离
self.layerView.layer.shadowOffset = CGSizeMake(0.0f, 5.0f);
//阴影的模糊度
self.layerView1.layer.shadowRadius = 5.0f;
专有图层
这一章介绍了CALayer的几个子类,它们有着各自的用途,这里说下几个比较常用的Layer。
CASharpLayer
CASharpLayer是一个通过矢量图形而不是bitmap来绘制的图形子类。它通过CGPath来定义想要绘制的图形,指定诸如颜色、线宽等属性后,Layer就绘制出来了。相比起普通的CALayer,CASharpLayer有着如下的优势:
- 渲染快速:CASharpLayer使用了硬件加速,绘制速度比CALayer快很多。
- 高效使用内存:不像普通的CALayer一样需要创建寄宿图来绘制,因此内存使用上会少很多。
- 不会被图层边界裁掉:CASharpLayer可以在边界之外绘制。
CATextLayer
CATextLayer是一个提供类似于UILabel功能的图层类,但它的渲染速度要比UILabel快很多,且可以使用它来实现富文本的渲染。
CAGradientLayer
CAGradientLayer用于生成两种或者多种颜色的平滑渐变的,它同样也使用了硬件加速。效果如下图:总结
本篇主要对CoreAnimation一书的前六章内容做了简单的笔记。各Layer具体的使用方法还需要阅读书籍并在实际工作中学习与使用。有关动画的部分将在下篇文章中给出。