iOS繪圖筆記——圖形上下文Drawing Context(2)

Drawing Context(1)超鏈接

本文接上文。鏈接奉上~


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)。具體代碼如下

Listing 1-10(1)
Listing 1-10(2)

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


Listing 1-11

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

Figure 1-12。

13.調(diào)整 Transforms

我們?cè)賮?lái)看看如圖所示的效果


Figure 1-13

要怎么實(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像素的上下文繪圖。

Listing 1-14

得出的效果如下


Figure 1-16

然后我們看看想用線(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)程安全的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容