整理一下CoreGraphic和Quartz2D的知識(一)

轉(zhuǎn)載文章弄抬。原文傳送門

1.Quartz 2D是什么?

?Quartz 2D以PDF的規(guī)范為基礎(chǔ)的圖形庫茎辐,用來繪制二維文字和圖形宪郊,允許相同的繪圖指令在任何裝置上,使用可以得到的最佳分辨率弛槐,產(chǎn)生相同的輸出.

2.Quartz2D能做什么?

?Quartz 2D API可以實現(xiàn)許多功能,如基于路徑的繪圖依啰、透明度乎串、陰影、顏色管理速警、反鋸齒叹誉、PDF文檔生成和PDF元數(shù)據(jù)訪問等

3.Quartz2D和CoreGraphic什么關(guān)系

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

4.Quartz2D有什么特性嗎?

?Quartz 2D與分辨率和設(shè)備無關(guān)长豁,因此在使用Quartz 2D繪圖時钧唐,無需考慮最終繪圖的目標(biāo)設(shè)備

5.Core Graphic是什么?

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

6.Core Graphic有什么用?

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

7.怎么引入Core Graphic?

?因為UIKit依賴于Core Graphics忽舟,所以當(dāng)引入時,Core Graphics框架會被自動引入淮阐,即UIKit內(nèi)部已經(jīng)引入了Core Graphics框架的主頭文件:

?為了讓開發(fā)者不必觸及底層的Core Graphics的C接口萧诫,UIKit內(nèi)部封裝了Core Graphics的一些API,可以快速生成通用的界面元素枝嘶。但是帘饶,有時候直接利用Core Graphics的C接口是很有必要和很有好處的,比如創(chuàng)建一個自定義的界面元素

此外圖形和圖像有什么區(qū)別?

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

---圖像:是以二進制數(shù)據(jù)的形式描述的一塊像素點陣,在應(yīng)用程序運行時竞阐,直接將該像素點陣逐一繪制在屏幕上

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

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

?在哪里繪圖缴饭?

1.圖形上下文(Graphics Context)

?如何繪圖?

1.Quartz 2D坐標(biāo)系

2.繪圖順序

3.UIView的drawRect:方法

4.Quartz 2D的內(nèi)存管理

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

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

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

?當(dāng)用Quartz繪圖時幕垦,所有設(shè)備相關(guān)的特性都包含在Graphics Context中丢氢。換句話說,我們可以簡單地給Quartz繪圖序列指定不同的Graphics Context先改,就可將相同的圖像繪制到不同的設(shè)備上疚察。而不需要任何設(shè)備相關(guān)的計算,這些都由Quartz替我們完成

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

1.Bitmap Graphics Context

2.PDF Graphics Context

3.Window Graphics Context

4.Layer Graphics Context

5.Printer Graphics Context

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

?一個Graphics Context表示一個繪制目標(biāo)仇奶。它包含繪制系統(tǒng)用于完成繪制指令的繪制參數(shù)和設(shè)備相關(guān)信息

?Graphics Context定義了基本的繪制屬性貌嫡,如顏色、裁減區(qū)域、線條寬度和樣式信息岛抄、字體信息别惦、混合模式等

?在iOS應(yīng)用程序中,如果要在屏幕上進行繪制夫椭,需要創(chuàng)建一個UIView對象步咪,并實現(xiàn)它的drawRect:方法。視圖的drawRect:方法在視圖顯示在屏幕上及它的內(nèi)容需要更新時被調(diào)用(drawRect:方法更詳細(xì)的介紹請移步蘋果官方文檔)

?在調(diào)用自定義的drawRect:后益楼,視圖對象自動配置繪圖環(huán)境以便能立即執(zhí)行繪圖操作

?作為配置的一部分猾漫,視圖對象將為當(dāng)前的繪圖環(huán)境創(chuàng)建一個Graphics Context。通過調(diào)用UIGraphicsGetCurrentContext()方法可以獲取當(dāng)前的Graphics Context

開發(fā)介紹如下:

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

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

?

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

?

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

?

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

?

?提示:如果繪圖的上下文桐绒,是使用UIGraphicsGetCurrentContext或者其他以UI開頭的方法獲取到的夺脾,在繪圖時無需進行坐標(biāo)轉(zhuǎn)換

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

?Quartz中默認(rèn)的坐標(biāo)系統(tǒng)是:原點(0, 0)在左下角。沿著X軸從左到右坐標(biāo)值逐漸增大茉继;沿著Y軸從下到上坐標(biāo)值逐漸增大

?有一些技術(shù)在設(shè)置它們的graphics context時使用了不同于Quartz的默認(rèn)坐標(biāo)系統(tǒng)咧叭。最常見的一種修改的坐標(biāo)系統(tǒng)是原點位于左上角,而沿著Y軸從上到下坐標(biāo)值逐漸增大烁竭。例如:UIView中的UIGraphicsGetCurrentContext方法返回的圖形上下文就是用的是這種坐標(biāo)系菲茬。

Quartz2D坐標(biāo)轉(zhuǎn)換如下:

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

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

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

?注意:

–轉(zhuǎn)換坐標(biāo)系前,使用CGContextSaveGState(CGContextRef c)保存當(dāng)前上下文狀態(tài)

–坐標(biāo)系轉(zhuǎn)換后派撕,使用CGContextRestoreGState(CGContextRef c)可以恢復(fù)之前保存的上下文狀態(tài)

如何利用Quartz2D繪制UIView

?當(dāng)在UIView子類中重寫drawRect:方法時婉弹,iOS會自動準(zhǔn)備好一個圖形上下文,可以通過調(diào)用UIGraphicsGetCurrentContext()來獲取

?只要一個UIView需要被刷新或者重繪腥刹,drawRect:方法就會被調(diào)用马胧,所以drawRect:的調(diào)用頻率很高

?需要注意的是:重繪時應(yīng)該調(diào)用setNeedsDisplay,而不能直接調(diào)用drawRect:衔峰,setNeedsDisplay會自動調(diào)用drawRect:

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

?drawRect:是在UIViewController的loadView和viewDidLoad兩方法之后調(diào)用的

?如果在UIView初始化時沒有設(shè)置CGRect,drawRect:將不會被自動調(diào)用

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

?如果使用UIView繪圖垫卤,只能在drawRect:方法中獲取相應(yīng)的CGContextRef并繪圖威彰。而在其他方法中獲取的CGContextRef不能用于繪圖

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

?使用含有“Create”或“Copy”的函數(shù)創(chuàng)建的對象,使用完后必須釋放穴肘,否則將導(dǎo)致內(nèi)存泄露

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

?如果retain了一個對象,不再使用時评抚,需要將其release掉豹缀。可以使用Quartz 2D的函數(shù)來指定retain和release一個對象慨代。例如邢笙,如果創(chuàng)建了一個CGColorSpace對象,則使用函數(shù)CGColorSpaceRetain和CGColorSpaceRelease來retain和release對象侍匙。也可以使用Core Foundation的CFRetain和CFRelease氮惯。注意不能傳遞NULL值給這些函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市想暗,隨后出現(xiàn)的幾起案子妇汗,更是在濱河造成了極大的恐慌,老刑警劉巖说莫,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杨箭,死亡現(xiàn)場離奇詭異,居然都是意外死亡储狭,警方通過查閱死者的電腦和手機告唆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晶密,“玉大人擒悬,你說我怎么就攤上這事〉炯瑁” “怎么了懂牧?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尊勿。 經(jīng)常有香客問我僧凤,道長,這世上最難降的妖魔是什么元扔? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任躯保,我火速辦了婚禮,結(jié)果婚禮上澎语,老公的妹妹穿的比我還像新娘途事。我一直安慰自己验懊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布尸变。 她就那樣靜靜地躺著义图,像睡著了一般。 火紅的嫁衣襯著肌膚如雪召烂。 梳的紋絲不亂的頭發(fā)上碱工,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音奏夫,去河邊找鬼怕篷。 笑死,一個胖子當(dāng)著我的面吹牛酗昼,可吹牛的內(nèi)容都是我干的廊谓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼仔雷,長吁一口氣:“原來是場噩夢啊……” “哼蹂析!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碟婆,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤电抚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竖共,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙叛,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年公给,在試婚紗的時候發(fā)現(xiàn)自己被綠了借帘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡淌铐,死狀恐怖肺然,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腿准,我是刑警寧澤际起,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站吐葱,受9級特大地震影響街望,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弟跑,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一灾前、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孟辑,春花似錦哎甲、人聲如沸蔫敲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燕偶。三九已至喝噪,卻和暖如春础嫡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酝惧。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工榴鼎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晚唇。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓巫财,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哩陕。 傳聞我的和親對象是個殘疾皇子平项,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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