原文鏈接 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,則是藍色部分區(qū)域。
本人注:clockwise為1應該是順時針方向,為0是逆時針方向
*clockwise
Specify 1 to create a clockwise arc or 0 to create a counterclockwise arc.
??
???
?
?
CGContextAddArc的使用
這個函數(shù)讓我在紙上畫了半天才搞明白,把我的理解給大家分享下。
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,則是藍色部分區(qū)域。
例子-----------------------------------------(畫一個圓環(huán)--大圓環(huán)套小圓環(huán))
#define ToRadian(radian) (radian*(M_PI/180.0))
-(void)drawRect:(CGRect)rect{
[super drawRect:rect];
//大圓環(huán)------------
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2,radius,ToRadian(45), ToRadian(135), 0);
[self.backgurondWithGaugeColor setStroke];//圓環(huán)的顏色
CGContextSetLineWidth(ctx, 40);//大圓環(huán)的圓環(huán)粗細為40
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextDrawPath(ctx, kCGPathStroke);
//小圓環(huán)(和大圓環(huán)類似)------------
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)));
}