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ù)