iOS Quartz 2D 使用詳解

前言:

? ? ? 雖然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)];

六:圖片裁剪


七:截取屏幕獲取圖片:



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發出絢麗的界面效果,一方面得益于成功系統的設計,另一方面得益...
    韓七夏閱讀 2,796評論 2 10
  • 本章中迄今為止的繪制實施例中大多會產生一個UIImage對象,主要是通過調用UIGraphicsBeginImag...
    shenzhenboy閱讀 1,382評論 0 4
  • 我最親愛的寶貝 你生來圓滿俱足 你是那么淳樸、善良、富有朝氣 你有無窮的智慧,無窮的力量 遇到任何困難不低頭 遇到...
    冰清玉潔2017閱讀 226評論 0 0
  • 大清早起床,又是美好的一天開始了,今天好像是周末,別的小朋友好像都放假了,而我只能待在家里不能出去. 于是大清早起...
    是代打還閱讀 132評論 0 0
  • 九月九日憶重陽 登高遙望爹和娘 銘感此生養育恩 無言寄思兩高堂
    南郭校尉閱讀 220評論 0 0