前言:
? ? ? 雖然UIKit框架給我們提供了很多好用的UI控件,如:UIButton,UIImage,UILabel壮啊,這些基本能滿足我們大部分開(kāi)發(fā)需求,但是對(duì)于一些比較復(fù)雜的蹋半,比較個(gè)性化的UI他巨,如需要顯示:餅圖充坑,柱狀圖等减江,這個(gè)時(shí)候就需要我們自定義View了,這時(shí)可以利用Quartz2D技術(shù)將控件內(nèi)部的結(jié)構(gòu)畫(huà)出來(lái)捻爷,自定義控件的樣子辈灼。然后顯示在我們的界面上。
? ? ? ? 這部分內(nèi)容在開(kāi)發(fā)中使用的也是挺普遍的也榄,由于時(shí)常會(huì)忘記一些內(nèi)容巡莹,特寫(xiě)一篇文章記錄一下司志,方便日后使用的時(shí)候查看,同時(shí)再加深一下自己的印象降宅,也希望能幫助到一些朋友骂远,謝謝。
一:Quartz 2D介紹
? ? ? ? ? Quart2D是CoreGraphic的一部分腰根,基于C的API激才,一個(gè)二維繪圖引擎,同時(shí)支持iOS和Mac系統(tǒng)额嘿。這個(gè)繪圖引擎是設(shè)備無(wú)關(guān)的瘸恼,也就是說(shuō),不用關(guān)心設(shè)備的大小册养,設(shè)備的分辨率东帅,只要利用Quartz 2D,這些設(shè)備相關(guān)的會(huì)自動(dòng)處理球拦。在使用的時(shí)候需要導(dǎo)入CoreGraphics.framework
? ? ? ? ?功能:
繪制圖形 : 線條\三角形\矩形\圓\弧等 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制文字 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制\生成圖片(圖像) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
讀取\生成PDF ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
截圖\裁剪圖片 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
自定義UI控件
二:圖形上下文
? ? ? ? 在ios中繪制圖形靠闭,離不開(kāi)圖形上下文,它用來(lái)包含繪制的結(jié)果坎炼,然后把這個(gè)結(jié)果渲染到屏幕上去阎毅,而Quartz 2D的容器就是CGContextRef數(shù)據(jù)模型。這種數(shù)據(jù)模型是C的結(jié)構(gòu)體点弯,存儲(chǔ)了渲染到屏幕上需要的一切信息扇调。圖形上下文就相當(dāng)于畫(huà)布,不同類(lèi)型的畫(huà)布就是決定著畫(huà)得內(nèi)容將展示在哪里抢肛。
? ? ? 類(lèi)型:
Bitmap Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
PDF Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Window Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Layer Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Printer Graphics Context
? ? ? 作用:
1:保存繪圖信息狼钮、繪圖狀態(tài)
2:決定繪制的輸出目標(biāo)(繪制到什么地方去?)(輸出目標(biāo)可以是PDF文件捡絮、Bitmap或者顯示器的窗口上)
三:利用Quartz 2D自定義view
? ? ?drawRect:方法介紹
? ? ? 自定義View需要新建一個(gè)View繼承自UIView熬芜,默認(rèn)的就會(huì)有一個(gè)drawRect方法,調(diào)用自定義的View中的drawRect:方法之前福稳,視圖對(duì)象會(huì)自動(dòng)配置其繪制環(huán)境涎拉,使代碼可以立即進(jìn)行繪制。作為這些配置的一部分的圆,UIView對(duì)象會(huì)為當(dāng)前繪制環(huán)境創(chuàng)建一個(gè)圖形上下文(對(duì)應(yīng)于CGContextRef封裝類(lèi)型)鼓拧。在其他地方拿不到view相關(guān)的上下文,所以不能實(shí)現(xiàn)繪制越妈。
? ? ? 想要把繪制的圖像顯示到view上季俩,圖形上下文必須跟view相關(guān)聯(lián),才能將內(nèi)容繪制到view上面梅掠,只有在drawRect:方法中才能取得跟view相關(guān)聯(lián)的圖形上下文酌住,View內(nèi)部有個(gè)layer(圖層)屬性店归,drawRect:方法中取得的是一個(gè)Layer Graphics Context,因此酪我,繪制的東西其實(shí)是繪制到view的layer上去了消痛,View之所以能顯示東西,完全是因?yàn)樗鼉?nèi)部的layer都哭。所以這個(gè)方法是自定義view必須要實(shí)現(xiàn)的方法肄满。
? ? drawRect:方法的調(diào)用
*當(dāng)視圖第一次加載的時(shí)候就會(huì)調(diào)用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*當(dāng)視圖重新繪制的時(shí)候會(huì)調(diào)用
注意: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
drawRect方法不能直接手動(dòng)調(diào)用,手動(dòng)調(diào)用獲取不到正確的上下文,只能系統(tǒng)自動(dòng)調(diào)用
通過(guò)調(diào)用視圖的setNeedsDisplay來(lái)進(jìn)行重繪,setNeedsDisplay:這個(gè)方法中內(nèi)部會(huì)自動(dòng)調(diào)用drawRect方法.
? ?自定義view的步驟:
新建一個(gè)類(lèi)质涛,繼承自UIView ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
實(shí)現(xiàn)- (void)drawRect:(CGRect)rect方法稠歉,然后在這個(gè)方法中 ? ? ? ? ? ? ? ? ?
取得跟當(dāng)前view相關(guān)聯(lián)的圖形上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制相應(yīng)的圖形內(nèi)容 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
利用圖形上下文將繪制的所有內(nèi)容渲染顯示到view上面
四:利用Quartz 2D自定義view的實(shí)例
此實(shí)例都是通過(guò)c語(yǔ)言實(shí)現(xiàn),也可以通過(guò)oc語(yǔ)言路徑實(shí)現(xiàn)
1>:繪制一條線段
獲取圖形上下文? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRef ref=UIGraphicsGetCurrentContext();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
新建一個(gè)圖形的起點(diǎn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextMoveToPoint(ref, 20, 20);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
添加一個(gè)線段到某個(gè)點(diǎn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextAddLineToPoint(ref, 100, 100);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染? ? ? 如果只是繪制一條線段,需要用stroke來(lái)渲染 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokePath(ref);
2>:繪制三角形 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
獲取圖型上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextRef ref=UIGraphicsGetCurrentContext(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 繪制圖形如果設(shè)置線段的時(shí)候,沒(méi)有移動(dòng)到新的線段的起點(diǎn),會(huì)默認(rèn)以上一個(gè)線段的結(jié)束點(diǎn)作為起點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
移動(dòng)到某一點(diǎn)新建一個(gè)圖形的起點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextMoveToPoint(ref, 50, 20); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
添加一個(gè)線段到某個(gè)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextAddLineToPoint(ref, 100, 100); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制第二條線段 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextAddLineToPoint(ref, 20, 40); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制第三條線段 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextAddLineToPoint(ref, 50, 20); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokePath(ref);
3>:繪制矩形
獲取上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextRefref=UIGraphicsGetCurrentContext(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制圖形 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextAddRect(ref,CGRectMake(30, 20, 100, 50)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??CGContextFillPath(ref);
4>:繪制橢圓
獲取上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextRefref=UIGraphicsGetCurrentContext(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制圖形 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextAddEllipseInRect(ref,CGRectMake(30, 20, 100, 50)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??CGContextFillPath(ref);
5>:繪制圓
獲取上下文? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRefref=UIGraphicsGetCurrentContext();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制圖形 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextAddArc(ref, 100, 100, 50, 0,M_PI*2, 0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextFillPath(ref);
注:CGContextAddArc參數(shù)含義 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <#CGFloat x#>, <#CGFloat y#>,用來(lái)表示圓心汇陆,<#CGFloat radius#>:表示圓的半徑怒炸,<#CGFloat startAngle#>:表示開(kāi)始角度,<#CGFloat endAngle#>:結(jié)束角度毡代,<#int clockwise#>:用來(lái)表示順時(shí)針還是逆時(shí)針阅羹,0.表示順時(shí)針,1.表示逆時(shí)針教寂。oc相反捏鱼。
6>:繪制實(shí)心的圓弧
獲取上下文? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRefref=UIGraphicsGetCurrentContext();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制圓弧? ? ? 繪制線段先? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextMoveToPoint(ref, 100, 100);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextAddLineToPoint(ref, 150, 100);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制弧線? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextAddArc(ref, 100, 100, 50, 0, M_PI_2, 0);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
閉合路徑 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextClosePath(ref); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextFillPath(ref);
設(shè)置圖形或線段樣式的方法:通用
// 設(shè)置線條顏色 紅色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextSetRGBStrokeColor(ref, 1.0, 0, 0, 1.0);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設(shè)置線條寬度? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextSetLineWidth(ref, 10);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設(shè)置線條的起點(diǎn)和終點(diǎn)的樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGLineCapButt,? 默認(rèn) kCGLineCapRound,? 圓角? kCGLineCapSquare? 沒(méi)什么效果? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextSetLineCap(ref, kCGLineCapRound);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設(shè)置線條的連接點(diǎn)的樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGLineJoinMiter,默認(rèn)樣式 kCGLineJoinRound,圓角樣式? kCGLineJoinBevel:切角樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextSetLineJoin(ref, kCGLineJoinRound);
圖形上下文棧的兩種方法:圖形顯示的原理
//先把當(dāng)前的圖形上下文狀態(tài)保存到棧 在設(shè)置屬性之前保存 保存的是系統(tǒng)默認(rèn)狀態(tài),如果在設(shè)置之后保存酪耕,保存的是設(shè)置之后的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextSaveGState(ref);
//設(shè)置繪圖狀態(tài)? 如果想恢復(fù)原始的設(shè)置用此方法导梆,還原繪圖狀態(tài),最原始的狀態(tài),會(huì)從圖形上下文狀態(tài)棧當(dāng)中把當(dāng)前的覆蓋掉? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRestoreGState(ref);
圖形上下文的矩陣變化
利用矩陣操作迂烁,能讓繪制到上下文中的所有路徑一起發(fā)生變化, ? ? ?給上下文做矩陣變化,一定要在添加路徑之前
平移 ? ? ? ?CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)
縮放? ? ? ? CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)
旋轉(zhuǎn)? ? ? ? CGContextRotateCTM(CGContextRef c, CGFloat angle)
渲染的方式
渲染的方式Stroke空心 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokePath(ref);
渲染的方式Fill實(shí)心 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextFillPath(ref);
通過(guò)mode? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGPathFill,? ? kCGPathEOFill,? ? kCGPathStroke,kCGPathFillStroke,? kCGPathEOFillStroke 看尼。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextDrawPath(ref, kCGPathEOFillStroke);
用來(lái)渲染指定范圍內(nèi)的視圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokeRect(ref, CGRectMake(0, 0, 200, 200));
實(shí)際應(yīng)用:餅圖
積偶填充規(guī)則
結(jié)論:被覆蓋過(guò)奇數(shù)次的點(diǎn)填充,被覆蓋過(guò)偶數(shù)次的點(diǎn)不填充
非零環(huán)繞數(shù)規(guī)則:
結(jié)論: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
默認(rèn)填充模式:kCGPathFill,從左到右跨過(guò), +1盟步。從右到左跨過(guò), -1藏斩。最后如果為0,那么不填充,否則填充。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
也就是說(shuō): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
觀察最里面的圓依次與外面的圓相比較却盘,看旋轉(zhuǎn)方向狰域,如果順時(shí)針和逆時(shí)針畫(huà)出來(lái)的圓個(gè)數(shù)相等(算最里面的圓)則最里面的圓等于0,不填充黄橘,反之不等于0兆览,填充。依次類(lèi)推旬陡,再拿第二個(gè)圓與外面的圓比較拓颓,同理语婴。
五:利用UIKit進(jìn)行繪圖
1>:繪制文字
NSString*text =@"sdafsafg";? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//創(chuàng)建一個(gè)可變字典描孟,來(lái)儲(chǔ)存文字的狀態(tài)? ? ? ? ? ? ? ? ? ? ? ? ? ? NSMutableDictionary*attributesDict = [NSMutableDictionarydictionary];? ? ? ? ?
attributesDict[NSFontAttributeName] = [UIFontsystemFontOfSize:20];//大小
attributesDict[NSForegroundColorAttributeName] = [UIColorredColor];//顏色
drawAtPoint這個(gè)方法文字不可以自動(dòng)換行表示繪制的位置[textdrawAtPoint:CGPointMake(0, 0)withAttributes:attributesDict];? ? ? ? ? ? ? ? ? ? ?
drawInRect這個(gè)方法文字可以自動(dòng)換行 表示繪制的范圍 只能在某一個(gè)范圍
[text drawInRect:rect withAttributes:attributesDict];
2>:繪制圖片
UIImage *image = [UIImage imageNamed:@"圖片.png"]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設(shè)置矩形剪裁區(qū)域,一定要在渲染之前? 把超出剪裁區(qū)域的部分全部剪裁掉UIRectClip(CGRectMake(0, 0, 50, 50)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 平鋪 會(huì)把給定的范圍填充滿圖片 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [image drawAsPatternInRect:rect]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 默認(rèn)顯示的尺寸就是圖片的尺寸 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [image drawAtPoint:CGPointZero]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//顯示的圖片尺寸就是設(shè)置的范圍 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //[image drawInRect:CGRectMake(0, 0, 100, 100)];