在iOS中,一个UIView已经有了CALayer,可是又有一个CAShapeLayer的实现,这个类是CALayer的子类,重新实现了一个CAShapeLayer的原因有下面的这些原因
1. CAShapeLayer使用了硬件加速的方式来绘图,所以比Core Graphics的绘图速度更快
2. CAShapeLayer的内存消耗更少
3. CAShapeLayer中作图可以画到它的边界外面,CALayer中作图的话只会显示layer边界以内的内容
4. pixel和point的坐标系转化
CAShapeLayer可以很方便的使用CAPathRef类型,没必要像CALayer中那么复杂的需要使用类似于CAPathRect, CGContextSetLineWidth这些看似比较复杂的函数。
在CGContext下,可以创建一个Path,这个Path由用户自己定义图形的样子。在CALayer的常用方法中,有cornerRadius属性,定义了一个矩形的圆角模式,但是同时影响了4个交,在path中,我门当然可以画出一个不是四个角都是圆角的矩形,比如下面这个例子
CGRect rect = CGRectMake(50, 50, 100, 100); CGSize radii = CGSizeMake(15, 5); UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft; UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii]; CAShapeLayer *shapeLayer = [CAShapeLayer layer]; shapeLayer.strokeColor = [UIColor redColor].CGColor; shapeLayer.fillColor = [UIColor clearColor].CGColor; shapeLayer.lineWidth = 5; shapeLayer.lineJoin = kCALineJoinRound; shapeLayer.lineCap = kCALineCapRound; shapeLayer.path = path.CGPath; [self.view.layer addSublayer:shapeLayer];
这段代码,我们画了一个只有三个圆角的矩形,另外,定义strokeColor,fillColor,lineWidth这些操作都方便了很多,但有一点要注意,这些属性一旦定义,则在这个layer上的所以操作都将使用这个属性,如果你想使用不同的属性,比如线条颜色这些,那你只有使用一个新的CAShapeLayer了。
画出来的图形效果如下
当然,这个CAShapeLayer也可以当做maskLayer来使用,在文章 http://shellcodes.sinaapp.com/?p=526 中可以看到用法,这样就可以制作出符合自己风格的图片显示效果