參考文章 http://blog.csdn.net/rhljiayou/article/details/9919713
/貝塞爾基本用法
-(void)bezier{
//初始化
UIBezierPath *path = [UIBezierPath bezierPath];
//設置起點
[path moveToPoint:CGPointMake(10, 10)];
//設置終點
[path addLineToPoint:CGPointMake(100, 100)];
//設置線寬
[path setLineWidth:10.0];
//設置線冒
[path setLineCapStyle: kCGLineCapRound];
//設置拐角(兩條直線才能有拐角)
[path setLineCapStyle:kCGLineCapRound];
//設置線的顏色
[[UIColor redColor] setStroke];
//設置填充顏色
[[UIColor yellowColor] setFill];
//閉合路徑
[path closePath];
//填充
[path fill];
//繪制
[path stroke];
}
pragma mark--使用貝塞爾曲線畫各種圖形
-(void)graphics{
//不透明類型的quartz 2d繪畫環(huán)境,相當于一個畫布,可以在上面任意繪畫
CGContextRef context = UIGraphicsGetCurrentContext();
//填充顏色
CGContextSetRGBFillColor(context, 1, 0, 0, 1.0);
UIFont *font = [UIFont boldSystemFontOfSize:15.0];
[@"畫扇形和橢圓:" drawInRect:CGRectMake(10, 160, 110, 20) withFont:font];
[@"畫三角形:" drawInRect:CGRectMake(10, 220, 80, 20) withFont:font];
[@"畫圓角矩形:" drawInRect:CGRectMake(10, 260, 100, 20) withFont:font];
[@"畫貝塞爾曲線:" drawInRect:CGRectMake(10, 300, 100, 20) withFont:font];
[@"圖片:" drawInRect:CGRectMake(10, 340, 80, 20) withFont:font];
[@"畫圓:" drawInRect:CGRectMake(10, 20, 80, 20) withFont:font];
pragma mark---畫圓
//邊框圓
CGContextSetRGBStrokeColor(context, 1, 1, 1, 1);//畫筆的顏色
CGContextSetLineWidth(context, 1.0);//線的寬度
//void CGContextAddArc(CGContextRef c,CGFloat x, CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle, int clockwise)1弧度=180°/π (≈57.3°) 度=弧度×180°/π 360°=360×π/180 =2π 弧度
// x,y為圓點坐標浸间,radius半徑太雨,startAngle為開始的弧度,endAngle為 結束的弧度魁蒜,clockwise 0為順
CGContextAddArc(context, 100, 20, 15, 0, 2 * M_PI, 0); //添加一個圓
CGContextDrawPath(context, kCGPathStroke);//繪制路徑
//填充圓,無邊框
CGContextAddArc(context, 150, 30, 30, 0, 2* M_PI, 0);
CGContextDrawPath(context, kCGPathFill);//繪制填充
//畫大圓并填充顏色
UIColor *acolor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
CGContextSetFillColorWithColor(context, acolor.CGColor);//填充顏色
CGContextSetLineWidth(context, 3.0);//線的寬度
CGContextAddArc(context, 250, 40, 40, 0, 2 * M_PI, 0);
//kCGPathFill填充非零繞數(shù)規(guī)則,只顯示填充的顏色,不顯示邊框的顏色,kCGPathEOFill表示用奇偶規(guī)則(只顯示填充顏色),kCGPathStroke路徑(只顯示畫筆也就是邊框的顏色),kCGPathFillStroke路徑填充(邊框顏色和填充顏色都顯示),kCGPathEOFillStroke表示描線囊扳,不是填充(邊框和畫筆顏色都顯示)
CGContextDrawPath(context, kCGPathEOFillStroke);
[@"畫線及弧形" drawInRect:CGRectMake(10, 80, 100, 100) withFont:font];
CGPoint apoint[2];//坐標點
apoint[0] = CGPointMake(100, 80);//坐標1
apoint[1] = CGPointMake(130, 80);//坐標2
// CGContextAddLines(CGContextRef _Nullable c, const CGPoint * _Nullable points, size_t count)
//第二個參數(shù) points[],坐標數(shù)組,第三個參數(shù) count大小
CGContextAddLines(context, apoint, 2);//添加線
CGContextDrawPath(context, kCGPathStroke);//根據(jù)坐標繪制路徑
pragma mark ---畫笑臉弧形
//左
CGContextSetRGBStrokeColor(context, 0, 0, 1, 1);//改變畫筆顏色
CGContextMoveToPoint(context, 140, 80);//開始坐標pi
//CGContextAddArcToPoint(CGContextRef _Nullable c, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius)
//x1 ,y1跟p1形成一條線的坐標p2,x2,y2結束坐標跟p3(x1,y1)形成一條直線,radius:半徑 注意算好半徑的大小
CGContextAddArcToPoint(context, 148, 68, 156, 80, 10);
CGContextStrokePath(context);//繪制路徑
//右
CGContextMoveToPoint(context, 160, 80);//開始坐標p1
CGContextAddArcToPoint(context, 168, 68, 176, 80, 10);
CGContextStrokePath(context);
//下
CGContextMoveToPoint(context, 150, 90);
CGContextAddArcToPoint(context, 158, 102, 166, 90, 10);
CGContextStrokePath(context);
pragma mark ----畫矩形
CGContextStrokeRect(context, CGRectMake(100, 120, 10, 10));//畫方框
CGContextFillRect(context, CGRectMake(120, 120, 10, 10));//填充框
//矩形,并填充顏色
CGContextSetLineWidth(context, 2.0);//線的寬度
acolor = [UIColor blueColor];
CGContextSetFillColorWithColor(context, acolor.CGColor);//填充顏色
acolor = [UIColor yellowColor];
CGContextSetStrokeColorWithColor(context, acolor.CGColor);
CGContextAddRect(context, CGRectMake(140, 120, 60, 30));
CGContextDrawPath(context, kCGPathFillStroke);
pragma mark---矩形并漸變改變顏色
//第一種填充方式,第一種方式必須導入類庫quartcore并#import <QuartzCore/QuartzCore.h>,這個就不輸入context上畫了.而是將層插入到view層上面,那么這里就設計到quartz core圖層編程了
CAGradientLayer *gradient1 = [CAGradientLayer layer];
gradient1.frame = CGRectMake(240, 120, 60, 30);
gradient1.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor,(id)[UIColor grayColor].CGColor,(id)[UIColor blueColor].CGColor,(id)[UIColor yellowColor].CGColor,(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor orangeColor].CGColor,(id)[UIColor brownColor].CGColor, nil];
[self.layer insertSublayer:gradient1 atIndex:0];
//第二章填充方式
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat clolors[] = {
1,1,1,1.00,
1,1,0,1.00,
1,0,0,1.00,
1,0,1,1.00,
0,1,1,1.00,
0,1,0,1.00,
0,0,1,1.00,
0,0,0,1.00
};
CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, clolors, NULL, sizeof(clolors)/(sizeof(clolors[0] * 4)));//形成梯形,漸變的效果
CGColorSpaceRelease(rgb);
//畫線形成一個矩形
//CGContextSaveGState與CGContextRestoreCState的作用
//CGContextSaveGState函數(shù)的作用是將當前圖形的狀態(tài)推入堆棧.之后,您對圖形的所做的修改會影響之后的描畫操作,但不影響存儲在堆棧中的拷貝.在修改完成后,您可以通過CGContextRestoreSCtate函數(shù)把堆棧頂部的狀態(tài)彈出,返回之前的圖形狀態(tài).這種推入和彈出是回到之前圖形狀態(tài)的快速方法,避免逐個撤銷所有的狀態(tài)修改;這也是將某些狀態(tài)(比如裁剪路徑)恢復到原有設置的唯一方式
CGContextSaveGState(context);
CGContextMoveToPoint(context, 220, 90);
CGContextAddLineToPoint(context, 240, 90);
CGContextAddLineToPoint(context, 240, 110);
CGContextAddLineToPoint(context, 220, 110);
CGContextClip(context);//context裁剪路徑后續(xù)操作的路徑 //煤墙,然后調用CGContextClip方法,而不是像之前那樣填充它宪拥。以后的繪制動作都會被限定在那個區(qū)域中!
// CGContextDrawLinearGradient(CGContextRef _Nullable c, CGGradientRef _Nullable gradient, CGPoint startPoint, CGPoint endPoint, CGGradientDrawingOptions options)
//gradient漸變顏色 ,startPoint:開始漸變的起始位置,endpoint結束坐標 ,options開始坐標之前or開始之后開始漸變
CGContextDrawLinearGradient(context, gradient, CGPointMake(220, 90), CGPointMake(240, 110), kCGGradientDrawsAfterEndLocation);
CGContextRestoreGState(context);//恢復到之前的context
//再寫一個看看效果
CGContextSaveGState(context);
CGContextMoveToPoint(context, 260, 90);//設置起點
CGContextAddLineToPoint(context, 280, 90);
CGContextAddLineToPoint(context, 280, 100);
CGContextAddLineToPoint(context, 260, 100);
CGContextClip(context);
//開始和結束坐標是控制漸變的方向和形狀
CGContextDrawLinearGradient(context, gradient, CGPointMake(260, 90), CGPointMake(260, 100), kCGGradientDrawsAfterEndLocation);
CGContextRestoreGState(context);
//漸變的圓
//CGContextDrawRadialGradient(CGContextRef _Nullable c, CGGradientRef _Nullable gradient, CGPoint startCenter, CGFloat startRadius, CGPoint endCenter, CGFloat endRadius, CGGradientDrawingOptions options)
//startCenter中心圓點(白色的起點)
//startRadius:起點的半徑,這個值多大,中心就是多大一塊純色的白圈
//endCenter;白色的終點(可以和起點一樣,不一樣的話就像探照燈一樣從起點投影到這個終點)
//endRadius:終點的半徑
//CGGradientDrawingOptions options //應該是 kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation
CGContextDrawRadialGradient(context, gradient, CGPointMake(300, 100), 5.0, CGPointMake(300, 100), 30, kCGGradientDrawsBeforeStartLocation);
pragma mark---畫橢圓
//中心點坐標 160,180 寬度20 高度8
CGContextAddEllipseInRect(context, CGRectMake(160, 180, 20, 8));//橢圓
CGContextDrawPath(context, kCGPathFillStroke);
pragma mark---畫三角形
//只要三個點就行跟畫一條線的方式一樣,把三個點連接起來
CGPoint sPoints[3];//坐標點
sPoints[0] = CGPointMake(100, 220);
sPoints[1] = CGPointMake(130, 220);
sPoints[2] = CGPointMake(130, 160);
CGContextAddLines(context, sPoints, 3);
CGContextClosePath(context);//封起來
CGContextDrawPath(context, kCGPathFillStroke);//根據(jù)坐標繪制路徑
pragma mark ---畫扇形
acolor = [UIColor colorWithRed:0 green:1 blue:1 alpha:1];
CGContextSetFillColorWithColor(context, acolor.CGColor);//填充顏色
//以10為半徑圍繞圓心畫指定角度的扇形
CGContextMoveToPoint(context, 160, 180);
// CGContextAddArc(CGContextRef _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
//1)startAngle為0,綠色箭頭的地方铣减。
//2)endAngle為45,黃色箭頭的地方她君。
//3)clockwise為0,按照紅色箭頭往下繪制圖形。
//4)所以效果就是紅色的扇形葫哗。
// 補充:如果clockwise為1缔刹,則是藍色部分區(qū)域
CGContextAddArc(context, 160, 180, 30, 0, 45 *(M_PI/ 180), 1);
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke);
pragma mark---畫圓角矩形
float fw = 180;
float fh = 280;
CGContextMoveToPoint(context, fw, fh - 20);//開始坐標右邊開始
CGContextAddArcToPoint(context, fw, fh, fw - 20, fh, 10);//右下角角度
CGContextAddArcToPoint(context, 120, fh, 120, fh - 20, 10);//左下角角度
CGContextAddArcToPoint(context, 120, 250, fw - 20, 250, 10);//左上角
CGContextAddArcToPoint(context, fw, 250, fw, fh -20, 10);//左上角
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke);
pragma mark ---畫貝塞爾曲線
//二次曲線
CGContextMoveToPoint(context, 120, 300);//起點
CGContextAddQuadCurveToPoint(context, 190, 310, 120, 390);//設置貝塞爾曲線的控制點(最高點或最低點)坐標和終點坐標c
CGContextStrokePath(context);
//三個點確定一條曲線
//三次曲線函數(shù)
CGContextMoveToPoint(context, 200, 300);
CGContextAddCurveToPoint(context,250, 280, 250, 400, 280, 300);//設置貝塞爾曲線的控制的坐標和控制的終點坐標
CGContextStrokePath(context);
pragma mark ---圖片
UIImage *image = [UIImage imageNamed:@"1.jpg"];
[image drawInRect:CGRectMake(60, 340, 20, 20)];//在坐標中畫出圖片(原圖)第一張圖
[image drawAtPoint:CGPointMake(100, 340)];///保持圖片大小在point點開始畫圖片,第二張圖
CGContextDrawImage(context, CGRectMake(100, 340, 20, 20), image.CGImage);//將原圖進行上下顛倒,大小為(20,20),第三張圖
pragma mark--解決圖片上下顛倒的問題
UIGraphicsPushContext(context);
[image drawInRect:CGRectMake(0, 0, 20, 20)];
UIGraphicsPopContext();//第四張圖