iOS--Quartz 2D(下)

1.Quartz 2D是什么?

?Quartz 2D以PDF的規范為基礎的圖形庫,用來繪制二維文字和圖形,允許相同的繪圖指令在任何裝置上,使用可以得到的最佳分辨率,產生相同的輸出.

2.Quartz2D能做什么?

?Quartz 2D API可以實現許多功能,如基于路徑的繪圖、透明度、陰影、顏色管理、反鋸齒、PDF文檔生成和PDF元數據訪問等

3.Quartz2D和CoreGraphic什么關系

?Quartz 2D API是Core Graphic框架的一部分,因此其中的很多數據類型和方法都是以CG開頭的。會經常見到Quartz 2D(Quartz)和Core Graphics兩個術語交互使用

4.Quartz2D有什么特性嗎?

?Quartz 2D與分辨率和設備無關,因此在使用Quartz 2D繪圖時,無需考慮最終繪圖的目標設備

5.Core Graphic是什么?

?Core Graphic框架是一組基于C的API,可以用于一切繪圖操作,這個框架的重要性,僅次于UIKit和Foundation

6.Core Graphic有什么用?

?當使用UIKit創建按鈕、標簽或者其他UIView的子類時,UIKit會用Core Graphics將這些元素繪制在屏幕上。此外,UIEvent(UIKit中的事件處理類)也會使用Core Graphics,用來幫助確定觸摸事件在屏幕上所處的位置

7.怎么引入Core Graphic?

?因為UIKit依賴于Core Graphics,所以當引入時,Core Graphics框架會被自動引入,即UIKit內部已經引入了Core Graphics框架的主頭文件:?為了讓開發者不必觸及底層的Core Graphics的C接口,UIKit內部封裝了Core Graphics的一些API,可以快速生成通用的界面元素。但是,有時候直接利用Core Graphics的C接口是很有必要和很有好處的,比如創建一個自定義的界面元素

此外圖形和圖像有什么區別?

---圖形:以路徑的方式描述的一個形狀,在應用程序運行時,實時繪制(渲染/Rending)的形狀

---圖像:是以二進制數據的形式描述的一塊像素點陣,在應用程序運行時,直接將該像素點陣逐一繪制在屏幕上

所以不難看出圖形的性能一般都會比圖像高

--Quartz2D是用來繪圖的,但是在哪里繪圖?怎么繪制?

?在哪里繪圖?

1.圖形上下文(Graphics Context)

?如何繪圖?

1.Quartz 2D坐標系

2.繪圖順序

3.UIView的drawRect:方法

4.Quartz 2D的內存管理

Graphics Context(繪圖目標)是什么?

?Graphics Context是一個數據類型(CGContextRef),封裝了Quartz繪制圖像到輸出設備的信息。輸出設備可以是PDF文件、Bitmap或者顯示器的窗口上

?Quartz中所有的對象都是繪制到一個Graphics Context中

?當用Quartz繪圖時,所有設備相關的特性都包含在Graphics Context中。換句話說,我們可以簡單地給Quartz繪圖序列指定不同的Graphics Context,就可將相同的圖像繪制到不同的設備上。而不需要任何設備相關的計算,這些都由Quartz替我們完成

指定不同的上下文便可以在不同的設備上繪圖,那一共有幾種上下文呢?

1.Bitmap Graphics Context

2.PDF Graphics Context

3.Window Graphics Context

4.Layer Graphics Context

5.Printer Graphics Context

Graphics Context包含了什么?怎么用?????

?一個Graphics Context表示一個繪制目標。它包含繪制系統用于完成繪制指令的繪制參數和設備相關信息

?Graphics Context定義了基本的繪制屬性,如顏色、裁減區域、線條寬度和樣式信息、字體信息、混合模式等

?在iOS應用程序中,如果要在屏幕上進行繪制,需要創建一個UIView對象,并實現它的drawRect:方法。視圖的drawRect:方法在視圖顯示在屏幕上及它的內容需要更新時被調用(drawRect:方法更詳細的介紹請移步蘋果官方文檔)

?在調用自定義的drawRect:后,視圖對象自動配置繪圖環境以便能立即執行繪圖操作

?作為配置的一部分,視圖對象將為當前的繪圖環境創建一個Graphics Context。通過調用UIGraphicsGetCurrentContext()方法可以獲取當前的Graphics Context

開發介紹如下:

1.如果要開發iOS程序,我們大部分使用就是UIKit框架里面提供的控件,而其坐標系介紹如下:

?原點(0,0)在屏幕的左上角,X軸向右正向延伸,Y軸向下正向延伸

?

?iOS的像素分辨率會隨設備的硬件而變化,iPhone4第一次引入了視網膜屏幕,像素分辨率為960 * 640,剛好是前一代iPod和iPhone像素分辨率( 480 * 320)的兩倍

?

?在繪圖時,需要使用“點”的概念來思考問題,而不是像素。也就是說在點坐標系中繪圖,不是硬件的像素坐標系

?

?雖然這些設備的像素分辨率不同,但用到的坐標系保持不變(以點為單位)。在iPhone4上,一個點會用2像素寬度來繪制

?

?提示:如果繪圖的上下文,是使用UIGraphicsGetCurrentContext或者其他以UI開頭的方法獲取到的,在繪圖時無需進行坐標轉換

2.但是Quartz2D繪圖時使用的坐標系是跟UIKit坐標系不同的,介紹如下::

?Quartz中默認的坐標系統是:原點(0, 0)在左下角。沿著X軸從左到右坐標值逐漸增大;沿著Y軸從下到上坐標值逐漸增大

?有一些技術在設置它們的graphics context時使用了不同于Quartz的默認坐標系統。最常見的一種修改的坐標系統是原點位于左上角,而沿著Y軸從上到下坐標值逐漸增大。例如:UIView中的UIGraphicsGetCurrentContext方法返回的圖形上下文就是用的是這種坐標系,看下圖--->

bubuko.com,布布扣

Quartz2D坐標轉換如下:

1.CGContextRotateCTM(CGContextRef c, CGFloat angle)方法可以相對原點旋轉上下文坐標系

2.CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)方法可以相對原點平移上下文坐標系

3.CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)方法可以縮放上下文坐標系

?注意:

–轉換坐標系前,使用CGContextSaveGState(CGContextRef c)保存當前上下文狀態

–坐標系轉換后,使用CGContextRestoreGState(CGContextRef c)可以恢復之前保存的上下文狀態

如何利用Quartz2D繪制UIView

?當在UIView子類中重寫drawRect:方法時,iOS會自動準備好一個圖形上下文,可以通過調用UIGraphicsGetCurrentContext()來獲取

?只要一個UIView需要被刷新或者重繪,drawRect:方法就會被調用,所以drawRect:的調用頻率很高

?需要注意的是:重繪時應該調用setNeedsDisplay,而不能直接調用drawRect:,setNeedsDisplay會自動調用drawRect:

drawRect:方法注意事項::::

?drawRect:是在UIViewController的loadView和viewDidLoad兩方法之后調用的

?如果在UIView初始化時沒有設置CGRect,drawRect:將不會被自動調用

?如果設置UIView的contentMode屬性值為UIViewContentModeRedraw,那么將在每次更改frame時自動調用drawRect:

?如果使用UIView繪圖,只能在drawRect:方法中獲取相應的CGContextRef并繪圖。而在其他方法中獲取的CGContextRef不能用于繪圖

Quartz2D是C語言的框架,并且部分需要自己管理內存:

?使用含有“Create”或“Copy”的函數創建的對象,使用完后必須釋放,否則將導致內存泄露

?使用不含有“Create”或“Copy”的函數獲取的對象,則不需要釋放

?如果retain了一個對象,不再使用時,需要將其release掉。可以使用Quartz 2D的函數來指定retain和release一個對象。例如,如果創建了一個CGColorSpace對象,則使用函數CGColorSpaceRetain和CGColorSpaceRelease來retain和release對象。也可以使用Core Foundation的CFRetain和CFRelease。注意不能傳遞NULL值給這些函數

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

推薦閱讀更多精彩內容