iOS绘图的两种方式
CAShapeLayer 属于 CoreAnimation框架 继承自CALayer
一个CAShapeLayer对象只能配合一个UIBezierPath对象,但是这个UIBezierPath实例可以添加UIBezierPath实例。UIBezierPath提供矢量路径,路径会闭环即使UIBezierPath不是一个闭环取消,这样就得到了一个shape。
UIView的[- drawRect:]
方法是用CPU渲染的,而CAShaperLayer是使用GPU效率更高。
CAShapeLayer的属性:
- path:渲染路径
- fillColor: 图形的填充颜色(透明或者nil,不然默认是黑色)【重要】
- lineCap: 线端口样式(粗线段起始位置的圆角还是倒角)
- lineWidth: 线宽度
- stokeStart:在曲线中相对起点的位置【动画】
- strokeEnd:在曲线中相对终点的位置,必须大于stokeStart【动画】
- [setLineDashPattern:@[@(0),@(25)]; 设置虚线:虚线段长度,虚线段的间隔
UIBezierPath的属性和常用方法:
-
初始化实例对象
- 默认 [UIBezierPath bezierPath];
- 带图形的
- 矩形曲线: [UIBezierPath bezierPathWithRect:CGRectMake(160, 70, 100, 50)]
- 圆弧: [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:50 startAngle:M_PI endAngle:3*M_PI clockwise:YES]
- 椭圆: [+ bezierPathWithOvalInRect:]
-
[- moveToPoint:] 开始一个新的起点来作画
-
[- appendPath:] 添加一个子路线(同心圆)
-
[-addCurveToPoint:controlPoint1:controlPoint2] 绘制二阶贝塞尔曲线
-
[- stroke] 关闭路径,在[- UIVie drawRect:]中,在CAShapeLayer中不会使用这个方法,否则控制面板会打印一些警告。
CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
PaintCode生成的代码是基于[- UIVie drawRect:]
,不能直接用于CAShapeLayer中,这里可以设置UIBezierPath的线宽。
在CAShapeLayer中设置UIBezierPath的线宽不起作用,需要设置CAShapeLayer的线宽。和UIBezierPath的appendPath一样CAShapeLayer也可以addSublayer
小结一下这样类有: NSString,NSMutableArray,NSMutableData,UIView,UILayer,CALayer
参考链接:
UIBezierPath
CGAffineTransform-仿射矩阵的变换
iOS UIBezierPath(贝塞尔曲线)
UIBezierPath