CAShapeLayer
CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。你指定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图形,最后CAShapeLayer就自动渲染出来了。当然,你也可以用Core Graphics直接向原始的CALyer的内容中绘制一个路径,相比直下,使用CAShapeLayer有以下一些优点:
①、渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多。
②、高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存。
③、不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通CALayer一样被剪裁掉。
④、不会出现像素化。当你给CAShapeLayer做3D变换时,它不像一个有寄宿图的普通图层一样变得像素化。
注:位图文件(Bitmap),扩展名可以是.bmp或者.dib。位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072KB。位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送。
注:矢量图:文件小,图像中保存的是线条和图块的信息,所以矢量图形文件与分辨率和图像大小无关,只与图像的复杂程度有关,图像文件所占的存储空间较小;图像可以无级缩放,对图形进行缩放,旋转或变形操作时,图形不会产生锯齿效果;可采取高分辨率印刷,矢量图形文件可以在任何输出设备打印机上以打印或印刷的最高分辨率进行打印输出;最大的缺点是难以表现色彩层次丰富的逼真图像效果;矢量图与位图的效果是天壤之别,矢量图无限放大不模糊,大部分位图都是由矢量导出来的,也可以说矢量图就是位图的源码,源码是可以编辑的。
创建一个CGPath
CAShapeLayer可以用来绘制所有能够通过CGPath来表示的形状。这个形状不一定要闭合,图层路径不一定要不可破,事实上你可以在一个图层上绘制几个不同的形状。你可以控制一些属性比如 lineWith (线宽)、lineCap(线结尾的样子)、lineJoin(线条之间的结合点的样子);但是图层层面你只有一次机会设置这些属性。如果你想用不同的颜色或风格来绘制多个形状,就不得不为每个形状准备一个图层了。
用CAShapeLayer绘制一个火柴人:
代码 效果图注:/* `fillRule' values. */ kCAFillRuleNonZero kCAFillRuleEvenOdd
/* `lineJoin' values. */ kCALineJoinMiter kCALineJoinRound kCALineJoinBevel
/* `lineCap' values. */ kCALineCapButt kCALineCapRound kCALineCapSquare
UIBezierPath:初始化很多,方法也很多,也可以组合画,画出不一样的东西。可以一一去尝试。
列如绘制矩形的构造方法
代码 效果
网友评论
CGPathAddLineToPoint(path, NULL, self.lineView.frame.size.width - 10, 0);
请问大神为甚么我画直线会越界啊,终点不是我设置的,并且在不同手机上效果不一样