IOS用CGContextRef畫各種圖形(轉載 原創(chuàng)地址http://blog.csdn.net/rhljiayou/article/details/9919713)

首先了解一下CGContextRef:

An opaque type that represents a Quartz 2D drawing environment.

Graphics Context是圖形上下文,可以將其理解為一塊畫布,我們可以在上面進行繪畫操作,繪制完成后,將畫布放到我們的view中顯示即可,view看作是一個畫框.

#import

#import?

#define?PI?3.14159265358979323846

@interface?CustomView?:?UIView

@end

#import "CustomView.h"

@implementation?CustomView

-?(id)initWithFrame:(CGRect)frame

{

self?=?[super?initWithFrame:frame];

if(self)?{

}

returnself;

}

//?覆蓋drawRect方法,你可以在此自定義繪畫和動畫

-?(void)drawRect:(CGRect)rect

{

//An?opaque?type?that?represents?a?Quartz?2D?drawing?environment.

//一個不透明類型的Quartz?2D繪畫環(huán)境,相當于一個畫布,你可以在上面任意繪畫

CGContextRef?context?=?UIGraphicsGetCurrentContext();

/*寫文字*/

CGContextSetRGBFillColor?(context,??1,?0,?0,?1.0);//設置填充顏色

UIFont??*font?=?[UIFont?boldSystemFontOfSize:15.0];//設置

[@"畫圓:"drawInRect:CGRectMake(10,?20,?80,?20)?withFont:font];

[@"畫線及孤線:"drawInRect:CGRectMake(10,?80,?100,?20)?withFont:font];

[@"畫矩形:"drawInRect:CGRectMake(10,?120,?80,?20)?withFont:font];

[@"畫扇形和橢圓:"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];

/*畫圓*/

//邊框圓

CGContextSetRGBStrokeColor(context,1,1,1,1.0);//畫筆線的顏色

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為順時針,1為逆時針。

CGContextAddArc(context,?100,?20,?15,?0,?2*PI,?0);//添加一個圓

CGContextDrawPath(context,?kCGPathStroke);//繪制路徑

//填充圓,無邊框

CGContextAddArc(context,?150,?30,?30,?0,?2*PI,?0);//添加一個圓

CGContextDrawPath(context,?kCGPathFill);//繪制填充

//畫大圓并填充顏

UIColor*aColor?=?[UIColor?colorWithRed:1?green:0.0?blue:0?alpha:1];

CGContextSetFillColorWithColor(context,?aColor.CGColor);//填充顏色

CGContextSetLineWidth(context,?3.0);//線的寬度

CGContextAddArc(context,?250,?40,?40,?0,?2*PI,?0);//添加一個圓

//kCGPathFill填充非零繞數規(guī)則,kCGPathEOFill表示用奇偶規(guī)則,kCGPathStroke路徑,kCGPathFillStroke路徑填充,kCGPathEOFillStroke表示描線,不是填充

CGContextDrawPath(context,?kCGPathFillStroke);//繪制路徑加填充

/*畫線及孤線*/

//畫線

CGPoint?aPoints[2];//坐標點

aPoints[0]?=CGPointMake(100,?80);//坐標1

aPoints[1]?=CGPointMake(130,?80);//坐標2

//CGContextAddLines(CGContextRef?c,?const?CGPoint?points[],size_t?count)

//points[]坐標數組,和count大小

CGContextAddLines(context,?aPoints,?2);//添加線

CGContextDrawPath(context,?kCGPathStroke);//根據坐標繪制路徑

//畫笑臉弧線

//左

CGContextSetRGBStrokeColor(context,?0,?0,?1,?1);//改變畫筆顏色

CGContextMoveToPoint(context,?140,?80);//開始坐標p1

//CGContextAddArcToPoint(CGContextRef?c,?CGFloat?x1,?CGFloat?y1,CGFloat?x2,?CGFloat?y2,?CGFloat?radius)

//x1,y1跟p1形成一條線的坐標p2,x2,y2結束坐標跟p3形成一條線的p3,radius半徑,注意,?需要算好半徑的長度,

CGContextAddArcToPoint(context,?148,?68,?156,?80,?10);

CGContextStrokePath(context);//繪畫路徑

//右

CGContextMoveToPoint(context,?160,?80);//開始坐標p1

//CGContextAddArcToPoint(CGContextRef?c,?CGFloat?x1,?CGFloat?y1,CGFloat?x2,?CGFloat?y2,?CGFloat?radius)

//x1,y1跟p1形成一條線的坐標p2,x2,y2結束坐標跟p3形成一條線的p3,radius半徑,注意,?需要算好半徑的長度,

CGContextAddArcToPoint(context,?168,?68,?176,?80,?10);

CGContextStrokePath(context);//繪畫路徑

//右

CGContextMoveToPoint(context,?150,?90);//開始坐標p1

//CGContextAddArcToPoint(CGContextRef?c,?CGFloat?x1,?CGFloat?y1,CGFloat?x2,?CGFloat?y2,?CGFloat?radius)

//x1,y1跟p1形成一條線的坐標p2,x2,y2結束坐標跟p3形成一條線的p3,radius半徑,注意,?需要算好半徑的長度,

CGContextAddArcToPoint(context,?158,?102,?166,?90,?10);

CGContextStrokePath(context);//繪畫路徑

//注,如果還是沒弄明白怎么回事,請參考:http://donbe.blog.163.com/blog/static/138048021201052093633776/

/*畫矩形*/

CGContextStrokeRect(context,CGRectMake(100,?120,?10,?10));//畫方框

CGContextFillRect(context,CGRectMake(120,?120,?10,?10));//填充框

//矩形,并填棄顏色

CGContextSetLineWidth(context,?2.0);//線的寬度

aColor?=?[UIColor?blueColor];//blue藍色

CGContextSetFillColorWithColor(context,?aColor.CGColor);//填充顏色

aColor?=?[UIColor?yellowColor];

CGContextSetStrokeColorWithColor(context,?aColor.CGColor);//線框顏色

CGContextAddRect(context,CGRectMake(140,?120,?60,?30));//畫方框

CGContextDrawPath(context,?kCGPathFillStroke);//繪畫路徑

//矩形,并填棄漸變顏色

//關于顏色參考http://blog.sina.com.cn/s/blog_6ec3c9ce01015v3c.html

//http://blog.csdn.net/reylen/article/details/8622932

//

第一種填充方式,第一種方式必須導入類庫quartcore并#import?,這個就

不屬于在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?blackColor].CGColor,

(id)[UIColor?yellowColor].CGColor,

(id)[UIColor?blueColor].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?colors[]?=

{

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,?colors,?NULL,sizeof(colors)/(sizeof(colors[0])*4));//形成梯形,漸變的效果

CGColorSpaceRelease(rgb);

//畫線形成一個矩形

//CGContextSaveGState與CGContextRestoreGState的作用

/*

CGContextSaveGState

函數的作用是將當前圖形狀態(tài)推入堆棧。之后,您對圖形狀態(tài)所做的修改會影響隨后的描畫操作,但不影響存儲在堆棧中的拷貝。在修改完成后,您可以通過

CGContextRestoreGState函數把堆棧頂部的狀態(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ù)操作的路徑

//CGContextDrawLinearGradient(CGContextRef?context,CGGradientRef?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);//?恢復到之前的context

//下面再看一個顏色漸變的圓

CGContextDrawRadialGradient(context,?gradient,?CGPointMake(300,?100),?0.0,?CGPointMake(300,?100),?10,?kCGGradientDrawsBeforeStartLocation);

/*畫扇形和橢圓*/

//畫扇形,也就畫圓,只不過是設置角度的大小,形成一個扇形

aColor?=?[UIColor?colorWithRed:0?green:1?blue:1?alpha:1];

CGContextSetFillColorWithColor(context,?aColor.CGColor);//填充顏色

//以10為半徑圍繞圓心畫指定角度扇形

CGContextMoveToPoint(context,?160,?180);

CGContextAddArc(context,?160,?180,?30,??-60?*?PI?/?180,?-120?*?PI?/?180,?1);

CGContextClosePath(context);

CGContextDrawPath(context,?kCGPathFillStroke);//繪制路徑

//畫橢圓

CGContextAddEllipseInRect(context,?CGRectMake(160,?180,?20,?8));//橢圓

CGContextDrawPath(context,?kCGPathFillStroke);

/*畫三角形*/

//只要三個點就行跟畫一條線方式一樣,把三點連接起來

CGPoint?sPoints[3];//坐標點

sPoints[0]?=CGPointMake(100,?220);//坐標1

sPoints[1]?=CGPointMake(130,?220);//坐標2

sPoints[2]?=CGPointMake(130,?160);//坐標3

CGContextAddLines(context,?sPoints,?3);//添加線

CGContextClosePath(context);//封起來

CGContextDrawPath(context,?kCGPathFillStroke);//根據坐標繪制路徑

/*畫圓角矩形*/

floatfw?=?180;

floatfh?=?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);//根據坐標繪制路徑

/*畫貝塞爾曲線*/

//二次曲線

CGContextMoveToPoint(context,?120,?300);//設置Path的起點

CGContextAddQuadCurveToPoint(context,190,?310,?120,?390);//設置貝塞爾曲線的控制點坐標和終點坐標

CGContextStrokePath(context);

//三次曲線函數

CGContextMoveToPoint(context,?200,?300);//設置Path的起點

CGContextAddCurveToPoint(context,250,?280,?250,?400,?280,?300);//設置貝塞爾曲線的控制點坐標和控制點坐標終點坐標

CGContextStrokePath(context);

/*圖片*/

UIImage?*image?=?[UIImage?imageNamed:@"apple.jpg"];

[image?drawInRect:CGRectMake(60,?340,?20,?20)];//在坐標中畫出圖片

//????[image?drawAtPoint:CGPointMake(100,?340)];//保持圖片大小在point點開始畫圖片,可以把注釋去掉看看

CGContextDrawImage(context,?CGRectMake(100,?340,?20,?20),?image.CGImage);//使用這個使圖片上下顛倒了,參考http://blog.csdn.net/koupoo/article/details/8670024

//????CGContextDrawTiledImage(context,?CGRectMake(0,?0,?20,?20),?image.CGImage);//平鋪圖

}

@end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容