學習coretext,最初的想法是寫乙個雜誌類的應用,因為對網易和zarca應用一些技術的疑問,所以,自己有了很強的興趣欲和鑽研欲,開始這段有點不順的學習過程。
1、對cgcontextref的ctm不理解,觀念導致很多東西沒有正確的理解。
2、對ns的了解不多,一些文字繪製方面的座標系問題讓自己很迷惑。
3、對coretext麻煩的api嚴重不適應。
ctm,context translate matrix。 它是把要繪製的上下文以乙個叫做matrix的東西來表示,可以簡單地想作,繪製的上下文的每乙個點都對映在matrix上,你在matrix上的操作都會使得上下文上的點產生相應的變動。如放大、旋轉、移動。
在一般的教程裡面,為了達到旋轉或放大縮小的目的,一般都會先改變這個上下文,如:
12345
cgcontexttranslatectm(context, 0, self.bounds.size.height);
cgcontextscalectm(context, 1.0f, -1.0f);
// some draw code
// ....
然後進行繪圖操作。那麼這個繪圖操作是怎麼做的呢?這個對matrix的操作,為什麼是放在前面而不是放在後面,為什麼放在後面又沒有效果呢?不是說改變matrix就會改變上面的對映的所有點呢?這些常規的邏輯思維使得問題越發無法理解和解決。那麼我們先從context來了解。
一般情況也,我們總是認為context就是畫布,所有的matrix旋轉都是針對畫布的旋轉,雖然這樣的理解是錯誤的,但是得到的結果卻是正確的,但是如果在一些稍複雜的座標系轉換時,或者更改matrix時在之前或之後的理解時,這樣理解就會得到難得理解的結果。
其實context說的是繪畫人所處的角度上下文。如下圖,預設的情況下,繪畫人的角度是正對著畫布的:
畫布是白色的,而我則是在左上角用乙個黃色的三角形來標識它的左上角,使用left top來標識context的左上角,而繪畫人是黃色的圓形。
要記著!!畫布無論怎麼樣都是正對著螢幕的,它不會旋轉,或者放大縮小,或者移動。
那麼為什麼又看起來我放大了或者移動了呢?其實移動的是你的context,也就是你所處的context視角,我舉個例子,比方說我要旋轉180度在左上角寫乙個「abcdefg」。
首先,我要先旋轉180度:
然後,我在左上角寫上「abcdefg」:
然後重置context:
可以看到,我們改變context只是改變了自己面對畫布的角度,而畫布仍然是正對著螢幕的,自己始終以context的左上角為自己角度的左上角,而不是以畫布的左上角為左上角,也就是說,這時繪畫時的座標(0,0)是你旋轉後context的left top,而不是畫布 的左上角,記著這一點很重要。
所以,在繪畫的時候,其實是倒著畫在了畫布的右下角上。而重置context,則是把自己正對著畫布而已。這也就說清了為什麼是在使用matrix更改context之後進行繪圖有效(把自己面對畫布的角度先調整了),而不是在畫了之後再調整(因為你都畫完了,再調整自己的角度還有什麼用?)。
正確理解使用matrix更改context的方式很重要,因為這涉及到座標系的問題,之後的coretext相當討論會講到乙個例子。
ns座標系是以左下角為(0,0),與ios的座標繫在y上是相反的,所以,在ios進行coretext進行繪圖或文字的時候,x方向是一致的,但是y則是倒過來的。如下圖:
那麼怎麼辦呢?想想,仔細看上面這張圖,貌似像是正常方向的倒影,但是水平線卻在最上面。嗯,挪下來,然後再反過來,看一下效果。如下圖:
效果:效果果然如圖所示,好!!
可是是不是就這樣完了呢?不是,還有乙個更為重要的問題,這個時候,進行了兩次的轉換matrix,context的left top在**呢?
根據之前的理論,那得讓自己先把自己向下移,然後把頭倒過來,ok,這下明白了,這下畫布的左下角變成了context的左上角,別的都沒變。這時,當你在(20, 20)畫乙個長方形,其實就是畫布的(20, canvas.height - 20 + rect.size.height)的位置上畫了個長方形,而且是倒過來的。
仔細想想這個,有趣的事情還有很多,因為按照自己看過本文之前的理論,可能會非常驚訝為什麼得到的結果和自己想的不一樣,一直以為是在(20, 20)處畫乙個長方形,結果卻剛好相反,這就是沒有理解context及matrix的正確含義所致。
IOS IOS UIView中的座標轉換
將畫素point由point所在檢視轉換到目標檢視view中,返回在目標檢視view中的畫素值 cgpoint convertpoint cgpoint point toview uiview view 將畫素point從view中轉換到當前檢視中,返回在當前檢視中的畫素值 cgpoint conv...
IOS UIView中的座標轉換
將畫素point由point所在檢視轉換到目標檢視view中,返回在目標檢視view中的畫素值 cgpoint convertpoint cgpoint point toview uiview view 將畫素point從view中轉換到當前檢視中,返回在當前檢視中的畫素值 cgpoint conv...
iOS UIView中的座標轉換
將畫素point由point所在檢視轉換到目標檢視view中,返回在目標檢視view中的畫素值 cgpoint convertpoint cgpoint point toview uiview view 將畫素point從view中轉換到當前檢視中,返回在當前檢視中的畫素值 cgpoint conv...