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

首先了解一下CGContextRef:

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

Graphics Context是圖形上下文,可以將其理解為一塊畫布,我們可以在上面進(jìn)行繪畫操作,繪制完成后,將畫布放到我們的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)境,相當(dāng)于一個畫布,你可以在上面任意繪畫

CGContextRef?context?=?UIGraphicsGetCurrentContext();

/*寫文字*/

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

UIFont??*font?=?[UIFont?boldSystemFontOfSize:15.0];//設(shè)置

[@"畫圓:"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為圓點坐標(biāo)竟秫,radius半徑,startAngle為開始的弧度额各,endAngle為?結(jié)束的弧度,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填充非零繞數(shù)規(guī)則,kCGPathEOFill表示用奇偶規(guī)則,kCGPathStroke路徑,kCGPathFillStroke路徑填充,kCGPathEOFillStroke表示描線,不是填充

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

/*畫線及孤線*/

//畫線

CGPoint?aPoints[2];//坐標(biāo)點

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

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

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

//points[]坐標(biāo)數(shù)組揪罕,和count大小

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

CGContextDrawPath(context,?kCGPathStroke);//根據(jù)坐標(biāo)繪制路徑

//畫笑臉弧線

//左

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

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

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

//x1,y1跟p1形成一條線的坐標(biāo)p2梯码,x2,y2結(jié)束坐標(biāo)跟p3形成一條線的p3,radius半徑,注意,?需要算好半徑的長度,

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

CGContextStrokePath(context);//繪畫路徑

//右

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

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

//x1,y1跟p1形成一條線的坐標(biāo)p2宝泵,x2,y2結(jié)束坐標(biāo)跟p3形成一條線的p3,radius半徑,注意,?需要算好半徑的長度,

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

CGContextStrokePath(context);//繪畫路徑

//右

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

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

//x1,y1跟p1形成一條線的坐標(biāo)p2,x2,y2結(jié)束坐標(biāo)跟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藍(lán)色

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

aColor?=?[UIColor?yellowColor];

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

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

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

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

//關(guān)于顏色參考http://blog.sina.com.cn/s/blog_6ec3c9ce01015v3c.html

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

//

第一種填充方式闯捎,第一種方式必須導(dǎo)入類庫quartcore并#import?,這個就

不屬于在context上畫许溅,而是將層插入到view層上面瓤鼻。那么這里就設(shè)計到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

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

CGContextRestoreGState函數(shù)把堆棧頂部的狀態(tài)彈出滚停,返回到之前的圖形狀態(tài)沃粗。這種推入和彈出的方式是回到之前圖形狀態(tài)的快速方法,避

免逐個撤消所有的狀態(tài)修改键畴;這也是將某些狀態(tài)(比如裁剪路徑)恢復(fù)到原有設(shè)置的唯一方式陪每。

*/

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結(jié)束坐標(biāo),options開始坐標(biāo)之前or開始之后開始漸變

CGContextDrawLinearGradient(context,?gradient,CGPointMake

(220,90)?,CGPointMake(240,110),

kCGGradientDrawsAfterEndLocation);

CGContextRestoreGState(context);//?恢復(fù)到之前的context

//再寫一個看看效果

CGContextSaveGState(context);

CGContextMoveToPoint(context,?260,?90);

CGContextAddLineToPoint(context,?280,?90);

CGContextAddLineToPoint(context,?280,?100);

CGContextAddLineToPoint(context,?260,?100);

CGContextClip(context);//裁剪路徑

//說白了,開始坐標(biāo)和結(jié)束坐標(biāo)是控制漸變的方向和形狀

CGContextDrawLinearGradient(context,?gradient,CGPointMake

(260,?90)?,CGPointMake(260,?100),

kCGGradientDrawsAfterEndLocation);

CGContextRestoreGState(context);//?恢復(fù)到之前的context

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

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

/*畫扇形和橢圓*/

//畫扇形镰吵,也就畫圓,只不過是設(shè)置角度的大小挂签,形成一個扇形

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];//坐標(biāo)點

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

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

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

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

CGContextClosePath(context);//封起來

CGContextDrawPath(context,?kCGPathFillStroke);//根據(jù)坐標(biāo)繪制路徑

/*畫圓角矩形*/

floatfw?=?180;

floatfh?=?280;

CGContextMoveToPoint(context,?fw,?fh-20);//?開始坐標(biāo)右邊開始

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);//根據(jù)坐標(biāo)繪制路徑

/*畫貝塞爾曲線*/

//二次曲線

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

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

CGContextStrokePath(context);

//三次曲線函數(shù)

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

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

CGContextStrokePath(context);

/*圖片*/

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

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

//????[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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勺馆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侨核,更是在濱河造成了極大的恐慌草穆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓译,死亡現(xiàn)場離奇詭異悲柱,居然都是意外死亡,警方通過查閱死者的電腦和手機些己,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門豌鸡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘿般,“玉大人,你說我怎么就攤上這事涯冠÷” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵蛇更,是天一觀的道長瞻赶。 經(jīng)常有香客問我,道長派任,這世上最難降的妖魔是什么砸逊? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吨瞎,結(jié)果婚禮上痹兜,老公的妹妹穿的比我還像新娘。我一直安慰自己颤诀,他們只是感情好字旭,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崖叫,像睡著了一般遗淳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上心傀,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天屈暗,我揣著相機與錄音,去河邊找鬼脂男。 笑死养叛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宰翅。 我是一名探鬼主播弃甥,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扶供,長吁一口氣:“原來是場噩夢啊……” “哼铃拇!你這毒婦竟也來了昂灵?” 一聲冷哼從身側(cè)響起鱼冀,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碱蒙,失蹤者是張志新(化名)和其女友劉穎挪钓,沒想到半個月后夹界,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飘千,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耸彪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年伞芹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝉娜。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡丑瞧,死狀恐怖柑土,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绊汹,我是刑警寧澤稽屏,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站西乖,受9級特大地震影響狐榔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜获雕,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一薄腻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧届案,春花似錦庵楷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至童漩,卻和暖如春弄贿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矫膨。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工差凹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侧馅。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓危尿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馁痴。 傳聞我的和親對象是個殘疾皇子脚线,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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