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值給這些函數