2012年11月1日 星期四

[iOS] Graphics and Drawing in iOS


  • 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方法取得

沒有留言:

張貼留言