首先, CAShapeLayer
是继承自CALayer
的. 因此可以使用CALayer
的所有属性, 但是, CAShapeLayer
需要和UIBezierPath
曲线配合使用才有意义.他有一个path
属性, 而UIBezierPath
就是对CGPathRef类型的封装(CGPathRef 是CGPath的重命名 , 实质就是CGPath). 因此这两者需要配合使用.
CAShapeLayer与UIBezierPath的关系
1.CAShapeLayer中Shape代表形状, 所以需要形状才能生效
2.贝塞尔曲线可以创建基于矢量的路径, 是对CGPathRef的封装
3.贝塞尔曲线给CAShapeLayer
提供路径, CAShapeLayer
在提供的路径中进行渲染. 路径会闭环, 所以绘制出了shape
.
4.用于CAShapeLayer
的贝塞尔曲线作为path
, 其path
是一个首尾相接的闭环的曲线. 即使给定的贝塞尔曲线, 不是一个闭环的曲线
.
- (CAShapeLayer *)drawCircle {
CAShapeLayer *circleLayer = [CAShapeLayer layer];
// 指定frame,只是为了设置宽度和高度
circleLayer.frame = CGRectMake(0, 0, 200, 200);
// 设置居中显示
circleLayer.position = self.view.center;
// 设置填充颜色
circleLayer.fillColor = [UIColor clearColor].CGColor;
// 设置线宽
circleLayer.lineWidth = 2.0;
// 设置线的颜色
circleLayer.strokeColor = [UIColor redColor].CGColor;
UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect:frame];
// 使用UIBezierPath创建路径
CGRect frame = CGRectMake(10, 10, 100, 100);
UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect:frame];
// 设置CAShapeLayer与UIBezierPath关联
circleLayer.path = circlePath.CGPath;
#从运行结果来看, 更像是把贝塞尔曲线添加到了layer层.
// 将CAShaperLayer放到某个层上显示
[self.view.layer addSublayer:circleLayer];
return circleLayer;
}```