0

私は uiscrollview に contentview を持っています。特定のレベルで uiscrollview がズームインまたはズームアウトするときに高解像度を得たいと思っています。私はこの目的を達成しましたが、高解像度のコンテンツを描画する前に、画面のフラッシュ (ビューの背景または前のタイル画像でフラッシュ) を行いました。スムーズな移行ではありません。scrollviewsuite のタイリング デモ (Apple のデモ) を参照します。私が行った違いは、スレッドでコンテンツを更新することです。このスレッドでは、タイル uiview でコンテンツを描画します (実際には、バックグラウンド スレッドで CALayer をペイントしたい)。私はそれを次のように呼びます:

[self perform: @selector(refreshContent) OnThread:mythread withObject:nil waitUntilDone:YES]

waiUntilDone:YESUIメインスレッドで使用しました。mythread がコンテンツを完全に再描画するのを待ちます。しかし、私はこのような状況になりました: 画面がいくつかのタイル コンテンツ (更新されていない) を点滅させてから、高解像度のコンテンツを取得します。

「refreshContent」の呼び出しを直接削除する[self perform: @selector(refreshContent) OnThread:mythread... と、画面が点滅せず、画面に表示されるコンテンツがすぐに更新されます。

興味があり、私を助けたい人は、Apple の scrollviewsuite デモで _Tiling デモを変更できます. スレッドを使用して、別の解像度でコンテンツを更新します。

私が言ったのは、バックグラウンドスレッドで calayer または uiview のコンテンツを更新すると、コンテンツがすぐに画面に表示されないということです...この問題を解決するのを手伝ってくれる人はいますか?

4

1 に答える 1

1

この質問の解決策を見つけました。答えは、スレッドで ui を直接更新することはできないということです (実行ループがスレッドで終了する[CATranscation flush]と、呼び出されない可能性があるため、更新画面の進行状況が連続せず、画面が点滅するため)、必要に応じて、次のようにすることができますこれ:

  1. 必要に応じてスレッド内の画像として calayer のコンテンツを準備します (画像は webkit などのエンジンからレンダリングするか、ネットワークからダウンロードできます)。

  2. スレッドでレンダリングされた画像を mainthread の calayer の contents プロパティに割り当てます。「メインスレッドで」、これは重要です。

上記の提案に従うと、画面のフラッシュの問題が解消されます..

スレッドはレンダリングスレッドであり、メインスレッドだけでなく他のスレッドでも何もレンダリングできないと思うので、スレッドで画像をレンダリングする理由を疑う人がいるかもしれません。

于 2012-05-17T14:17:31.913 に答える