CAShapeLayer
shape就是形状,顾名思义CAShapeLayer就是一个通过矢量图形而不是bitmap来绘制的图层子类,你指定颜色线宽等属性用CGpath来定义想要绘制的图形,最后CAShapeLayer就会自动的渲染出来了,当然也可以用CoreGraphics直接向原始的layer的内容中绘制一个路径,相比之下使用CAShapeLayer有一些优点:
渲染快速.CAShapeLayer使用了硬件加速,绘制同意图形会比Core Graphics快很多.
高效使用内存,CAShapeLayer一个CAShapeLayer不需要想普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用过多的内存.
不会被图层边界裁减掉,一个CAShapeLayer可以在边界之外绘制,如果用Core Graphics则会被裁减掉.
不会出现像素化,当你给CAShapeLayer组3D变换时,他不想一个有寄宿图形的普通图层一样变得像素化.
创建一个CGPath
CAShapeLayer 可以用来绘制所有能够通过CGPath来表示的形状.这个形状不一定要闭合,图层路径也不一定要不可破,事实上你可以在一个图层上绘制好几个不同的形状,你也可以控制一些属性如linewidth(线宽),linecap(线条结尾的样子),linejoin(线条直接结合点的样子),但是在图层层面你只有一次机设置这些属性,如果想用不同的颜色或者风格来绘制多个形状,就不得不为每个形状准备一个图层了.
下边我们 用CAShapeLayer绘制一个火柴人
-(void)drawLayerPeople {
UIBezierPath *path = [UIBezierPath bezierPath];
[path addArcWithCenter:CGPointMake(150, 100) radius:25 startAngle:0 endAngle:2*M_PI clockwise:YES];
[path moveToPoint:CGPointMake(150, 125)];
[path addLineToPoint:CGPointMake(150, 175)];
[path moveToPoint:CGPointMake(100, 150)];
[path addLineToPoint:CGPointMake(200, 150)];
[path moveToPoint:CGPointMake(150, 175)];
[path addLineToPoint:CGPointMake(125, 250)];
[path moveToPoint:CGPointMake(150, 175)];
[path addLineToPoint:CGPointMake(175, 250)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.strokeColor = [UIColor redColor].CGColor;
shapeLayer.lineWidth = 4;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.lineJoin = kCALineCapRound;
shapeLayer.path = path.CGPath;
[self.view.layer addSublayer:shapeLayer];
}
CAShapeLayer为创建圆角视图提供了一个方法,就是layer的cornerRadius属性.虽然使用CAShapeLayer类需要更多的工作,但是它有一个优势就是可以单独制定每个角
代码如下:
-(void)drawRectangular{
CGRect rect = CGRectMake(50,300, 100, 100);
CGSize radi = CGSizeMake(20, 20);
UIRectCorner corners = UIRectCornerTopRight | UIRectCornerTopLeft |UIRectCornerBottomLeft;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radi];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.strokeColor = [UIColor redColor].CGColor;
shapeLayer.lineWidth = 4;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.lineJoin = kCALineCapRound;
shapeLayer.path = path.CGPath;
[self.view.layer addSublayer:shapeLayer];
}