原文链接 http://differentisnotdifferent.diandian.com/post/2012-07-30/40032320467
CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, // 圆心(x,y)
CGFloat radius, // 半径
CGFloat startAngle, CGFloat endAngle, // 开始、结束弧度
int clockwise // 绘制方向,YES:逆时针;NO:顺时针
)
用法心得:
- 弧度 中心点右侧 弧度为 0 中心点下方 弧度为 M_PI_2 中心点左侧 弧度为 M_PI 中心点上方 弧度为 -M_PI_2
- 绘制x弧度圆 所谓x弧度圆,就是不满2π的圆弧。 比如 想画一个 缺口朝下&缺口弧度30度 的x弧度圆 选择逆时针画法: startAngle = M_PI_2 - (15/180M_PI); endAngle = M_PI_2 + (diff/180M_PI); clockwise = YES; 选择顺时针画法: startAngle = M_PI_2 + (15/180M_PI); endAngle = M_PI_2 - (diff/180M_PI); clockwise = NO;
- 链接文章中提到的图解(自己不会画图。。。) CGContextAddArc(context, 160, 200, 100, 0, 45*(M_PI/180), 0); 所以对上面这对代码的解释是这样的:
1)startAngle为0,绿色箭头的地方。
2)endAngle为45,黄色箭头的地方。
3)clockwise为0,按照红色箭头往下绘制图形。
4)所以效果就是红色的扇形。 补充:如果clockwise为1,则是蓝色部分区域。
本人注:clockwise为1应该是顺时针方向,为0是逆时针方向
*clockwise
Specify 1 to create a clockwise arc or 0 to create a counterclockwise arc.
CGContextAddArc的使用
这个函数让我在纸上画了半天才搞明白,把我的理解给大家分享下。
void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
CGContextRef不解释了,x,y为圆点坐标,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
CGContextAddArc(context, 160, 200, 100, 0, 45*(M_PI/180), 0);
所以对上面这对代码的解释是这样的:
1)startAngle为0,绿色箭头的地方。
2)endAngle为45,黄色箭头的地方。
3)clockwise为0,按照红色箭头往下绘制图形。
4)所以效果就是红色的扇形。
补充:如果clockwise为1,则是蓝色部分区域。
例子-----------------------------------------(画一个圆环--大圆环套小圆环)
#define ToRadian(radian) (radian*(M_PI/180.0))
-(void)drawRect:(CGRect)rect{
[super drawRect:rect];
//大圆环------------
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2,radius,ToRadian(45), ToRadian(135), 0);
[self.backgurondWithGaugeColor setStroke];//圆环的颜色
CGContextSetLineWidth(ctx, 40);//大圆环的圆环粗细为40
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextDrawPath(ctx, kCGPathStroke);
//小圆环(和大圆环类似)------------
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2, radius-5,ToRadian(45), 135*(M_PI/180.0), 0);
[self.progressColor setStroke];
CGContextSetLineWidth(ctx, 30);
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextDrawPath(ctx, kCGPathStroke);
needleView.transform = CGAffineTransformMakeRotation(ToRadian((drawScale*TotalAangle+45)));
}