本文書の目的
macOS, iOSのグラフィクスの座標系は、macOSが原点を左下に置くLLO(Lower Left Origin)、iOSが原点を左上に置くULO(Upper Left Origin)と、それぞれ異なっている。これは、macOS, iOSのいずれでも動作するフレームワークを開発するときに、混乱の元となる。
本文書では、macOS, iOS各々の各ソフトウェアコンポーネントの座標系についてまとめる。また、CoreGraphicsベースのフレームワークを作成するときの、座標系選択の戦略について述べる。
履歴
更新履歴
2016/11/08 新規作成
参考文献
座標系
以下に各OS, フレームワークが使用している座標系を挙げる。macOSとiOSで、CoreGraphicsの座標系が異なっている。
カテゴリ | macOS | iOS |
---|---|---|
GUI | LLO (AppKit) | ULO (UIKit) |
CoreGraphics | LLO | ULO |
- CoreGraphicsの座標系をULOからLLOに変更する方法
- CoreGraphicsとGUIの間で、パラメータの座標系を変換する方法
について述べる。
CoreGraphicsの座標系をULOからLLOに変更する方法
下記の処理を追加することで、CGContext
の座標系を変換できる。
context.translateBy(x: 0.0, y: height) // heightはGraphics領域の高さ
context.scaleBy(x: 1.0, y: -1.0)
CoreGraphicsとGUIの間で、パラメータの座標系を変換する方法
ULOからLLOへの変換
各種イベントで位置を表すパラメータ(touchから取得)は、LLOに変更する必要がある:
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
drawメソッドも、
func draw(_ dirtyRect: CGRect)
更新領域を表すRectを、LLOに変更する
LLOからULOへの変換
矩形情報(invalidRect)をULOに変更する
func setNeedsDisplay(_ invalidRect: CGRect)
まとめ
座標系の変更には、相当のコストが発生するので、ソフトの構想段階で、
- 各コンポーネントをULO/LLOのいずれにするか
- ULO⇄LLO変換はどこで行うか
決めておくと良い