本文接上文。鏈接奉上~
11.上下文坐標(biāo)系Context Coordinate System
在UIKit中采用的是左上原點(diǎn)坐標(biāo)系,在Quartz采用的是左下原點(diǎn)坐標(biāo)系。
原點(diǎn)在哪里取決于你用的是什么創(chuàng)建上下文。如果你用的是UIKit方法,原點(diǎn)在左上。如果你用的是CGBitmapContextCreate(),原點(diǎn)在左下。
???不過(guò)說(shuō)實(shí)話(huà)CG建上下文的方法那么麻煩 誰(shuí)沒(méi)事用哪個(gè)建立上下文啊。。。所以代碼沒(méi)仔細(xì)看,,不過(guò)還是貼出來(lái)了。。
當(dāng)然你也可以調(diào)整Core Graphics上下文使用UIKit的原點(diǎn)。具體代碼如下


12.剪輯Clipping
剪輯的意思是在你的上下文里所有繪圖操作都只能在限定的區(qū)域里進(jìn)行。為了進(jìn)行剪輯,先要向上下文中添加限制的區(qū)域的路徑,然后調(diào)用CGContextClip()方法。
具體步驟如下:
1.保存圖像的狀態(tài)。這可以讓你重現(xiàn)剪裁前的版本,如果你不需要返回可以跳過(guò)這一步。
2.向上下中添加一個(gè)路徑,然后調(diào)用CGContextClip方法。
3.開(kāi)始繪圖,路徑外的操作會(huì)被自動(dòng)丟棄掉。
4.返回1中保存的狀態(tài)。

大概可以剪出像這樣的圖,還是很洋氣吧

13.調(diào)整 Transforms
我們?cè)賮?lái)看看如圖所示的效果

要怎么實(shí)現(xiàn)這樣的效果呢,我們只需要借助于UIKit里面NSString自己的在上下文中繪圖的方法DrawAtPoint:withAttributes:方法就足夠了。具體代碼如下~

當(dāng)然我們之前提到的上下文狀態(tài)的時(shí)候,也有提到一種調(diào)整狀態(tài)(感激翻譯的不到位啊,原文是transform state)可以控制繪圖是的旋轉(zhuǎn)縮放和位移。當(dāng)然,我們只需要做一個(gè)小小的調(diào)整,上面那個(gè)例子就立馬可以變成下圖這樣?jì)鸬?,立馬又高端了一點(diǎn)。

具體代碼如下

還有另一種方法同樣可以實(shí)現(xiàn)上述效果,對(duì)比一下 看看有什么區(qū)別吧~

14.線(xiàn)的參數(shù)設(shè)置 Setting Line Parameters
可以通過(guò)CGContextSetLIneWidth來(lái)改變上下文中線(xiàn)的寬度。當(dāng)然,如果你用的是UIBezierPath,只用用path的lineWidth屬性來(lái)改變線(xiàn)的參數(shù)。
下面這個(gè)例子,分別用4像素的bezierpath繪圖和20像素的上下文繪圖。

得出的效果如下

然后我們看看想用線(xiàn)繪出一堆線(xiàn)段(Dashes)要怎么完成吧~
這里只需要一個(gè)方法就可以了。
在bezieropath里面是這樣的。

用圖形上是這樣的。

出來(lái)的效果都是下面這樣的

總結(jié)
·對(duì)于許多繪圖需求來(lái)說(shuō),有很多解決方法都可以達(dá)到相同的目的。至于是選擇Core Graphics的方法還是UIKit的方法,只會(huì)影響到你是選擇那一個(gè)API,這里沒(méi)有固定的答案,哪個(gè)你用起來(lái)表順手就用那個(gè)吧~
·UIKit在不斷的改進(jìn)。隨著iOS版本的更迭,蘋(píng)果提供了悅來(lái)越多的資源來(lái)讓你直接跳過(guò)使用Quartz里的方法。UIKit API提供了更為簡(jiǎn)潔的方法。大部分開(kāi)發(fā)者會(huì)發(fā)現(xiàn)UIKit的優(yōu)點(diǎn)更多的主要使用UIKit提供的方法來(lái)繪圖。當(dāng)然,蘋(píng)果也是建議開(kāi)發(fā)者使用最高級(jí)的API來(lái)編程,用低等級(jí)的API往往是在高級(jí)API中找不到對(duì)應(yīng)方法等時(shí)候,比如繪圖時(shí)計(jì)算陰影或者輸出顏色空間(color spaces)時(shí)。
·要熟悉核心庫(kù)的C語(yǔ)言風(fēng)格,以及手動(dòng)內(nèi)存管理的機(jī)制。了解Ref機(jī)制。有個(gè)規(guī)律如下:見(jiàn)到Copy和Create就要release。如果時(shí)Get,不需要。前綴create也要前綴release。比如,create a color space,就要用CGColorSpaceRelease()來(lái)釋放他~
·Quartz和UIKit都是線(xiàn)程安全的。