- UIKit Graphics System
- 不管是 OpenGL, Quartz, UIKit, Core Animation皆被 UIView的物件限制住. 因此, 若使用系統預設的 view, drawing會自動完成. 而若是 customized則須自己將 drawing code補完. 若使用 OpenGL, 一旦設定好 rendering surface, 則之後皆用 OpenGL提供的 drawing model做操作
- View Drawing cycle
- updating data on demand
- 需要 redraw時, UIView都會呼叫 drawRect: method並將需要重劃的 rect區域傳給該 method, 因此, 在客製化的 view中, 需要覆寫此 method
- update被 triggered的時機:
- 移動或移除某個曾遮隱該 view的 view時 (e.g. view2原本在 view1前面, 當 view1被關閉時, view2的 update動作會被呼叫)
- 將原本 visible 的 hidden屬性改為 No時
- 某 view被 pop回來時
- 明確呼叫 setNeedsDisplay或 setNeedsDisplayInRect: methods時
- 當 drawRect被呼叫時, 該 view的屬性會被改為 updated, 在等待下次 update被 trigger的時機
- 座標系統
- UIKit
- 左上角為原點,向右及向下為正
- current transformation matrix (CTM) 為一轉換矩陣, 由 view座標系統轉至裝置 (device) 座標系統的矩陣, 此矩陣在 drawRect被呼叫時會先做 configuration的動作使其 match目前 view的原點, 另外, 可藉由改變 scaling, rotation, translation來改變 CTM
- 畫圖可以利用建立 paths, 或是更簡單的利用改變 CTM來達成, 相較而言, 後者的 cost較低
- 改變 CTM的方法
- 直接對 CTM做運算, 可參考 CGContext Reference
- 建立一個 CGAffineTransform, 然後 concate該 matrix與 CTM, 細節可再參考 Quartz 2D Programming Guide 和 CGAffineTransform Reference
- Graphics Context
- 呼叫 drawRect: method前, view object會自動 configure, 除了 CTM (包含在 Graphics Context中)外, 還有重要的 configuration就是 graphics context, 他定義了顏色、切割區域 (clipping area)、線寬、風格資訊 (style information)、字型 (font) 資訊等等
- 尤其在建立 image及 PDF 檔案時, 尤其需要自行先建立一個 context來做一系列的 drawing commands, e.g. function: CGBitmapContextCreate、CGPDFContextCreate, ...
- 進階參考: Quartz 2D Programming Guide、CGContext Reference、CGBitmapContext Reference、CGPDFContext Reference
- 可怕的座標轉換
- 看似簡單的座標系統, 其實滿複雜的. 因為 UIKit以 upper-left-origin (ULO) 為主, 而 Core Graphics 則是 lower-left-origin(LLO)為主, 兩者需要一個 flipping的轉換
- 在某個 view中, 欲使用 Core Graphics作圖, 需要有 Graphics Context, 此時可以 UIGraphicsGetCurrentContext方法取得
2012年11月1日 星期四
[iOS] Graphics and Drawing in iOS
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言