CoreGraphic之畫圖

參考文章 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();//第四張圖
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劣针,隨后出現(xiàn)的幾起案子校镐,更是在濱河造成了極大的恐慌,老刑警劉巖捺典,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟廓,死亡現(xiàn)場離奇詭異,居然都是意外死亡襟己,警方通過查閱死者的電腦和手機引谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擎浴,“玉大人员咽,你說我怎么就攤上這事≈ぃ” “怎么了贝室?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仿吞。 經(jīng)常有香客問我滑频,道長,這世上最難降的妖魔是什么茫藏? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任误趴,我火速辦了婚禮,結果婚禮上务傲,老公的妹妹穿的比我還像新娘凉当。我一直安慰自己,他們只是感情好售葡,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布看杭。 她就那樣靜靜地躺著,像睡著了一般挟伙。 火紅的嫁衣襯著肌膚如雪楼雹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音贮缅,去河邊找鬼榨咐。 笑死,一個胖子當著我的面吹牛谴供,可吹牛的內(nèi)容都是我干的块茁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼桂肌,長吁一口氣:“原來是場噩夢啊……” “哼数焊!你這毒婦竟也來了?” 一聲冷哼從身側響起崎场,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤佩耳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谭跨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體干厚,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年饺蚊,在試婚紗的時候發(fā)現(xiàn)自己被綠了萍诱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡污呼,死狀恐怖裕坊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燕酷,我是刑警寧澤籍凝,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站苗缩,受9級特大地震影響饵蒂,放射性物質發(fā)生泄漏。R本人自食惡果不足惜酱讶,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一退盯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泻肯,春花似錦渊迁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稚铣,卻和暖如春箱叁,著一層夾襖步出監(jiān)牢的瞬間墅垮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工耕漱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留算色,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓螟够,卻偏偏與公主長得像剃允,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子齐鲤,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容