6

UIView同様のメソッドを実装するサブクラスが必要ですがsetNeedsDisplay、再描画 (つまり、通常は を介し​​て呼び出されdrawRect:ます) は、現在の更新サイクルの最後ではなく、バックグラウンド スレッドですぐに発生します。

と呼ばれることもありますsetNeedsAsynchronousDisplay。または、既存のsetNeedsDisplayものはハイジャックされ、サイクルの最後に再描画が発生しない可能性があります。ただし、メインスレッドブロック画面で再描画が発生しない限り、相互作用が完了するまで更新されます。

再描画が行われるまで、ビューは現在描画されている表現を引き続き使用できます。

これらの線に沿った何かが合理的に実行可能ですか?

ありがとう!

4

2 に答える 2

12

はい、可能です。おそらく、バックグラウンドでコンテンツ ビューを画像として生成し、その画像を nsdictionary または配列にプッシュする必要があります。

したがって、背景が画像を生成している間、画像が生成されていれば、画像をレンダリングすることで drawrect 関数で画像を表示できます。

その方法を示す WWDC ビデオ: WWDC 2012 セッション 211 - Building Concurrent User Interfaces on IOS。ビデオの説明は次のとおりです。

優れたユーザー エクスペリエンスを実現するには、アプリケーションが複雑な UI 要素をレンダリングしてデータを処理している間、アプリケーションの応答性を維持することが不可欠です。UIKit レイヤーで同時実行を使用して、ユーザーの操作をブロックせずに描画やその他の一般的な操作を実行する方法を学びます。

于 2014-01-15T14:06:27.377 に答える
-3

いいえ。View Drawing はフォアグラウンドで実行する必要があります。Apple はドキュメントでそれを明確にしています。

編集: UIView オブジェクトの描画メソッドに含まれていない限り、バックグラウンドで Core Graphics 描画を行うことができるのは正しいです。バックグラウンドで描画を行い、メイン スレッドにメッセージを送信して、描画が完了したらビュー オブジェクトを更新する必要があります。

setNeedsDisplay をオーバーライドしようとしないことをお勧めします。代わりに、新しい setNeedsAsynchronousDisplay メソッドを追加してください。そのメソッドでは、GCD 呼び出しを使用してレンダリング コードを非同期キューにキューイングします。レンダリングが完了したら、レンダリング コードで setNeedsDisplay メッセージをメイン スレッドの自分自身に送信します。

次に、サブクラスの drawRect メソッドで、事前にレンダリングされた画像をチェックし、通常のコードではなくビューのコンテキストにそれらを描画します。

これの欠点は、drawRect を実装するだけでは、ビューのコンテンツをレンダリングするための他のより効率的なことを行う代わりに、システムがそれを呼び出すため、レンダリングが遅くなる可能性があることです。

于 2014-01-15T14:00:41.413 に答える