ドローイングモデル
iOS と OS X で描画すると、二つの技術のパスの一つに従っており、ビューは要求に寄ってその外観を更新するモデルに基づいています。アプリのコンテンツを描画するには、OpenGL またはプラットフォームのネイティブレンダリング機能のいずれかを使用できます。
- OpenGL。OpenGL は、 デスクトップコンピュータ上の2Dおよび3Dコンテンツを作成するための C言語ベースのインタフェースです。これは、ゲームなどのアプリのプログラムを没入するタイプの、または高いフレームレートを必要とするアプリに最適です。OS X では、OpenGL のフレームワークのデスクトップバージョンがあり、 iOS では、組込みハードウェアシステム上で使用するために最適化された OpenGL ES のフレームワークが存在すします。
- ネイティブサポート。Quartz(Core Graphics)、Core Animation、および各プラットフォーム( UIKit フレームと AppKit)のためのアプリケーションフレームワークは、オブジェクト指向のモデルを使ってネイティブグラフィックスをサポートしています。Quartz は、主な描画インターフェースであり、パスベースの描画、アンチエイリアスレンダリング処理、グラデーション塗りつぶしパターン、画像、色、座標空間を変換、 PDF 文書の作成、表示、および解析のためのサポートを提供しする。あなたは多くのビュープロパティの変化をアニメーション化し、カスタムアニメーションを実装するために、Core Animation を使用することができます。 UIKit フレームと AppKit の両方は、画像、色、ベジェパスなどのグラフィカルエンティティを表す Objective-C のクラスを含み、また、テキストや簡単な図形を描画するためのサポートを提供しています。
OpenGL レンダリングは、多くの場合、アプリケーションフレームワークの UIKit フレームと AppKit で定義されたビュークラスを利用します。その場合には、描画モデルのいくつかの側面は、ネイティブレンダリングの場合と似ています。ただし、OpenGL アプリは、ビューに基づいている必要はありません。
注意: 以下の情報はネイティブレンダリングの描画モデルの側面について説明します。OpenGL と OpenGL ES の詳細については、OpenGL Programming Guide for Mac で OpenGL のウェブサイトを参照してください。
必要な時にはビューは drawRect : メソッドで自分自身を描画します。
描画モデルの主要な要素は、オンデマンドでコンテンツを更新することです。ビューは、drawRect: メソッドでそのコンテントを描きますが、そのメソッドはビューの基底クラス(UIView と NSView) が宣言したもので、ビューのサブクラスがオーバーライドした物です。矩形がメソッドに渡され、再描画が必要なビューの領域を識別します。ビューが最初ウインドウに現れた時、矩形はビューの境界と一致し、ビューは、そのすべてのコンテンツを描画します。その後、ビューは、必要なときだけ自分自身を描画し、変更された自身のその部分だけを描画します。
いくつかのアクションはビューの更新を引き起こせます
- コードは、その隠された(hidden) プロパティを NO に設定することで再び以前隠されたビューを表示するようになります。
- コードは、明示的にビューを無効化します
- レイヤに裏打ちされていないビューでは、ユーザが移動したり、部分的に別のビューを曖昧にしたビューを削除したりします。
- レイヤに裏打ちされていないビューでは、ユーザーはスクロールビューを含む所からビューをスクロールして見えなくしたり、それから再び逆にスクロールして見えるようにします。
ビューを無効とし、そして再描画のためにそれをマークするには、setNeedsDisplay や setNeedsDisplayInRect: などのメソッドをビューに呼び出します。
Core Animation レイヤーの存在は、ビューの描画動作に影響を与えます。レイヤーは、ビューに、余分な描画を必要とせずに操作することができるビットマップのコンテンツをキャッシュさせます。iOS 内のすべてのビューはレイヤにより裏打ちされています。OS X では、ビュー階層でのサポートを有効にすることで、レイヤーの裏打ちを選択して下さい。OS X では、また、レイヤーに裏打ちされたビューで最も効率的な再描画ポリシーを指定することもできます。
メインイベントループのサイクルの終わりに、ウィンドウは、ビュー階層を下に進み、それらのの drawRect: メソッドを呼び出すことによって、自分自身を描画するために、これらのビューを要求します。
グラフィックスコンテキストは、図面環境を設定
UIView と NSView は、drawRect: メソッドが呼出される前に、その描画環境を自動的に設定します。(AppKit フレームワークでは、描画環境を構成する事は、ロッキングフォーカス と呼ばれています。) この構成の一部として、ビュークラスは、現在の描画環境のグラフィックスコンテキストを作成します。
このグラフィックスコンテキストは、描画システムが必要とする情報を含む Quartz オブジェクト(CGContext) で、適用しようとする色、描画モード(一筆または塗りつぶし)、線幅とスタイル情報、フォント情報、および合成オプションなどの情報を含みます。(AppKit では、NSGraphicsContext クラスのオブジェクトは CGContext オブジェクトを覆い包みます。) グラフィックスコンテキストオブジェクトは、ウィンドウ、ビットマップ、PDF ファイル、またはその他の出力デバイスに伴われており、その実体の描画環境の現在の状態に関する情報を保持しています。ビューは、ビューのウィンドウに伴われているグラフィックスコンテキストを使用して描画します。ビューの場合、グラフィックスコンテキストは、ビューの境界に一致するようにデフォルトのクリッピング領域を設定し、ビューの境界の原点にデフォルトの描画の原点を置きます。
描画はビューローカル座標系で
ビューは、そのローカル座標系で自身を描画します。ビューの境界(bounds) プロパティは、この座標系での点の位置を定義するのに役立ちます。
現在の変換行列(CTM) を変更することにより、デフォルトの座標系を変更できます。CTM は、デバイスの画面上の点に、ビューの座標系の点をマップします。CTM を変更することで、サイズ、向き、および、スーパービューやウィンドウへの座標系での相対位置を変更することができ、それによって、スケーリング、回転、またはビューの移動をします。
描画コマンドは、ユーザー座標空間として知られている固定スケールの描画空間への参照を行います。オペレーティング·システムは、対応するターゲット·デバイスの実際のピクセルにこの描画空間座標単位でマッピングします。このように、デバイスがサポートする任意の解像度にビューの尺度によってベクトルのコマンドが発行されます。これらのコマンドは、ベクトルベースの描画に必要な精度を取得するために浮動小数点値を用いて描画座標を指定します。
前提条件の記事
関連記事
既知のディスカッション
ココアドローイングガイド
サンプルコードプロジェクト
Quartz 2D 変形
BezierPathLab