前言:
? ? ? 雖然UIKit框架給我們提供了很多好用的UI控件,如:UIButton,UIImage,UILabel,這些基本能滿足我們大部分開發需求,但是對于一些比較復雜的,比較個性化的UI,如需要顯示:餅圖,柱狀圖等,這個時候就需要我們自定義View了,這時可以利用Quartz2D技術將控件內部的結構畫出來,自定義控件的樣子。然后顯示在我們的界面上。
? ? ? ? 這部分內容在開發中使用的也是挺普遍的,由于時常會忘記一些內容,特寫一篇文章記錄一下,方便日后使用的時候查看,同時再加深一下自己的印象,也希望能幫助到一些朋友,謝謝。
一:Quartz 2D介紹
? ? ? ? ? Quart2D是CoreGraphic的一部分,基于C的API,一個二維繪圖引擎,同時支持iOS和Mac系統。這個繪圖引擎是設備無關的,也就是說,不用關心設備的大小,設備的分辨率,只要利用Quartz 2D,這些設備相關的會自動處理。在使用的時候需要導入CoreGraphics.framework
? ? ? ? ?功能:
繪制圖形 : 線條\三角形\矩形\圓\弧等 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制文字 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制\生成圖片(圖像) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
讀取\生成PDF ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
截圖\裁剪圖片 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
自定義UI控件
二:圖形上下文
? ? ? ? 在ios中繪制圖形,離不開圖形上下文,它用來包含繪制的結果,然后把這個結果渲染到屏幕上去,而Quartz 2D的容器就是CGContextRef數據模型。這種數據模型是C的結構體,存儲了渲染到屏幕上需要的一切信息。圖形上下文就相當于畫布,不同類型的畫布就是決定著畫得內容將展示在哪里。
? ? ? 類型:
Bitmap Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
PDF Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Window Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Layer Graphics Context ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Printer Graphics Context
? ? ? 作用:
1:保存繪圖信息、繪圖狀態
2:決定繪制的輸出目標(繪制到什么地方去?)(輸出目標可以是PDF文件、Bitmap或者顯示器的窗口上)
三:利用Quartz 2D自定義view
? ? ?drawRect:方法介紹
? ? ? 自定義View需要新建一個View繼承自UIView,默認的就會有一個drawRect方法,調用自定義的View中的drawRect:方法之前,視圖對象會自動配置其繪制環境,使代碼可以立即進行繪制。作為這些配置的一部分,UIView對象會為當前繪制環境創建一個圖形上下文(對應于CGContextRef封裝類型)。在其他地方拿不到view相關的上下文,所以不能實現繪制。
? ? ? 想要把繪制的圖像顯示到view上,圖形上下文必須跟view相關聯,才能將內容繪制到view上面,只有在drawRect:方法中才能取得跟view相關聯的圖形上下文,View內部有個layer(圖層)屬性,drawRect:方法中取得的是一個Layer Graphics Context,因此,繪制的東西其實是繪制到view的layer上去了,View之所以能顯示東西,完全是因為它內部的layer。所以這個方法是自定義view必須要實現的方法。
? ? drawRect:方法的調用
*當視圖第一次加載的時候就會調用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*當視圖重新繪制的時候會調用
注意: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
drawRect方法不能直接手動調用,手動調用獲取不到正確的上下文,只能系統自動調用
通過調用視圖的setNeedsDisplay來進行重繪,setNeedsDisplay:這個方法中內部會自動調用drawRect方法.
? ?自定義view的步驟:
新建一個類,繼承自UIView ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
實現- (void)drawRect:(CGRect)rect方法,然后在這個方法中 ? ? ? ? ? ? ? ? ?
取得跟當前view相關聯的圖形上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制相應的圖形內容 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
利用圖形上下文將繪制的所有內容渲染顯示到view上面
四:利用Quartz 2D自定義view的實例
此實例都是通過c語言實現,也可以通過oc語言路徑實現
1>:繪制一條線段
獲取圖形上下文? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRef ref=UIGraphicsGetCurrentContext();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
新建一個圖形的起點? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextMoveToPoint(ref, 20, 20);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
添加一個線段到某個點? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextAddLineToPoint(ref, 100, 100);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染? ? ? 如果只是繪制一條線段,需要用stroke來渲染 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokePath(ref);
2>:繪制三角形 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
獲取圖型上下文 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGContextRef ref=UIGraphicsGetCurrentContext(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 繪制圖形如果設置線段的時候,沒有移動到新的線段的起點,會默認以上一個線段的結束點作為起點 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
移動到某一點新建一個圖形的起點 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextMoveToPoint(ref, 50, 20); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
添加一個線段到某個點 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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參數含義 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <#CGFloat x#>, <#CGFloat y#>,用來表示圓心,<#CGFloat radius#>:表示圓的半徑,<#CGFloat startAngle#>:表示開始角度,<#CGFloat endAngle#>:結束角度,<#int clockwise#>:用來表示順時針還是逆時針,0.表示順時針,1.表示逆時針。oc相反。
6>:繪制實心的圓弧
獲取上下文? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRefref=UIGraphicsGetCurrentContext();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制圓弧? ? ? 繪制線段先? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextMoveToPoint(ref, 100, 100);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextAddLineToPoint(ref, 150, 100);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繪制弧線? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextAddArc(ref, 100, 100, 50, 0, M_PI_2, 0);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
閉合路徑 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextClosePath(ref); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
渲染? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextFillPath(ref);
設置圖形或線段樣式的方法:通用
// 設置線條顏色 紅色? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextSetRGBStrokeColor(ref, 1.0, 0, 0, 1.0);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設置線條寬度? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextSetLineWidth(ref, 10);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設置線條的起點和終點的樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGLineCapButt,? 默認 kCGLineCapRound,? 圓角? kCGLineCapSquare? 沒什么效果? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextSetLineCap(ref, kCGLineCapRound);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設置線條的連接點的樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGLineJoinMiter,默認樣式 kCGLineJoinRound,圓角樣式? kCGLineJoinBevel:切角樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
CGContextSetLineJoin(ref, kCGLineJoinRound);
圖形上下文棧的兩種方法:圖形顯示的原理
//先把當前的圖形上下文狀態保存到棧 在設置屬性之前保存 保存的是系統默認狀態,如果在設置之后保存,保存的是設置之后的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextSaveGState(ref);
//設置繪圖狀態? 如果想恢復原始的設置用此方法,還原繪圖狀態,最原始的狀態,會從圖形上下文狀態棧當中把當前的覆蓋掉? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextRestoreGState(ref);
圖形上下文的矩陣變化
利用矩陣操作,能讓繪制到上下文中的所有路徑一起發生變化, ? ? ?給上下文做矩陣變化,一定要在添加路徑之前
平移 ? ? ? ?CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)
縮放? ? ? ? CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)
旋轉? ? ? ? CGContextRotateCTM(CGContextRef c, CGFloat angle)
渲染的方式
渲染的方式Stroke空心 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokePath(ref);
渲染的方式Fill實心 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextFillPath(ref);
通過mode? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGPathFill,? ? kCGPathEOFill,? ? kCGPathStroke,kCGPathFillStroke,? kCGPathEOFillStroke 。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextDrawPath(ref, kCGPathEOFillStroke);
用來渲染指定范圍內的視圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGContextStrokeRect(ref, CGRectMake(0, 0, 200, 200));
實際應用:餅圖
積偶填充規則
結論:被覆蓋過奇數次的點填充,被覆蓋過偶數次的點不填充
非零環繞數規則:
結論: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
默認填充模式:kCGPathFill,從左到右跨過, +1。從右到左跨過, -1。最后如果為0,那么不填充,否則填充。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
也就是說: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
觀察最里面的圓依次與外面的圓相比較,看旋轉方向,如果順時針和逆時針畫出來的圓個數相等(算最里面的圓)則最里面的圓等于0,不填充,反之不等于0,填充。依次類推,再拿第二個圓與外面的圓比較,同理。
五:利用UIKit進行繪圖
1>:繪制文字
NSString*text =@"sdafsafg";? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//創建一個可變字典,來儲存文字的狀態? ? ? ? ? ? ? ? ? ? ? ? ? ? NSMutableDictionary*attributesDict = [NSMutableDictionarydictionary];? ? ? ? ?
attributesDict[NSFontAttributeName] = [UIFontsystemFontOfSize:20];//大小
attributesDict[NSForegroundColorAttributeName] = [UIColorredColor];//顏色
drawAtPoint這個方法文字不可以自動換行表示繪制的位置[textdrawAtPoint:CGPointMake(0, 0)withAttributes:attributesDict];? ? ? ? ? ? ? ? ? ? ?
drawInRect這個方法文字可以自動換行 表示繪制的范圍 只能在某一個范圍
[text drawInRect:rect withAttributes:attributesDict];
2>:繪制圖片
UIImage *image = [UIImage imageNamed:@"圖片.png"]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 設置矩形剪裁區域,一定要在渲染之前? 把超出剪裁區域的部分全部剪裁掉UIRectClip(CGRectMake(0, 0, 50, 50)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 平鋪 會把給定的范圍填充滿圖片 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [image drawAsPatternInRect:rect]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
// 默認顯示的尺寸就是圖片的尺寸 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [image drawAtPoint:CGPointZero]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//顯示的圖片尺寸就是設置的范圍 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //[image drawInRect:CGRectMake(0, 0, 100, 100)];