6

View and Window Architectureには、次のように記載されています。

ビューはコア アニメーション レイヤーと連動して、ビューのコンテンツのレンダリングとアニメーション化を処理します。UIKit のすべてのビューは、ビューのバッキング ストアを管理し、ビュー関連のアニメーションを処理するレイヤー オブジェクト(通常は CALayer クラスのインスタンス) によってサポートされます。

さらに、「ビュー描画サイクル」セクションで次のように述べられています。

UIView クラスは、コンテンツの表示にオンデマンドの描画モデルを使用します。ビューが最初に画面に表示されると、システムはビューにそのコンテンツを描画するように要求します。システムはこのコンテンツのスナップショットをキャプチャし、そのスナップショットをビューの視覚的表現として使用します。

drawRect メソッド呼び出しでビューに描画されたコンテンツは、スナップショットに取り込まれ、バッキング コア アニメーション レイヤーに保存されるということですか?

そうでない場合、このコンテンツ スナップショットはどこに「存在」しますか?

そうでない場合、それは CALayer が「静的」コンテンツ (あまり頻繁に変更されないコンテンツ) をレンダリングするために使用され、drawRect がゲーム アプリなどで頻繁に変更されるコンテンツをレンダリングするために使用されることを意味しますか?

ps

質問は、特定のコードの実装とは関係ありません。

iOS ビューレイヤー アーキテクチャを理解したいだけです。

4

3 に答える 3

1

drawRect メソッド呼び出しでビューに描画されたコンテンツは、スナップショットに取り込まれ、バッキング コア アニメーション レイヤーに保存されるということですか?

2 つの単語: 「実装の詳細」

そうでない場合、それは CALayer が「静的」コンテンツ (あまり頻繁に変更されないコンテンツ) をレンダリングするために使用され、drawRect がゲーム アプリなどで頻繁に変更されるコンテンツをレンダリングするために使用されることを意味しますか?

ではない正確に。レイヤーは、コンテンツのアニメーション化に非常に優れています (フレームワーク名 Core Animationからもわかるように)。drawRect は高度な描画に適していますが、すべてのフレームの再描画が遅くなる可能性があります (明らかに、何を描画しているかによって異なります)。

あなたの質問には、Core Animation Programming Guideについての言及はありませんでした。ビューのレイヤー部分について学ぶには良い場所です。

于 2013-04-12T08:18:33.447 に答える
0

すべての UIView には、基礎となる CALayer (実際に画面にレンダリングされるもの) があります。

CALayer は単なるビットマップです (ピクセルを保持します)。ビューに setNeedsDisplay を呼び出すと、CALayer が再描画用にマークされます。実行ループの最後で、イベントが処理された後、CGContextRef が作成され、drawRect デリゲートが呼び出されます。次に、作成されたコンテキストに物事を描画します。これはビットマップにコピーされ、最終的に他のレイヤーと合成されて画面に表示されます。

はい、「スナップショット」はCALayerに保存されます。これは単なる最適化であり、(setNeedsDisplay を使用して) 再描画のフラグが設定されていない限り、レイヤー自体を再描画する必要はありません。

于 2013-04-12T08:29:37.367 に答える