私はいくつかのビューコントローラでUIWebViews
を使用するアプリケーションを持っています。 UIWebViews
は、ローカルに生成されたhtmlをレンダリングするために使用され、遅いネットワークアクセスは必要ありません。webViewDidFinishLoadまでviewWillAppearを延期する
メモリを節約するため、私はviewcontroller viewWillAppear
コールバックのプロンプトに従ってオンデマンドでのみロードします。 didReceiveMemoryWarning
メッセージに応答してオフスクリーンインスタンスをアンロードします。
問題は、レンダリングされるhtmlが表示され、時にはスタイリングやその他の不愉快なアーティファクトが伴って表示されることです。むしろレンダリングはオフスクリーンで行い、完全にレンダリングされたビューはその準備ができたら明らかにします。
UIWebViewが完全にレンダリングされるまでviewWillAppear
が返されないようにすることは非常に整然としたことです。しかしどうですか?
私はUIWebView
に、loadHTMLString:baseURL:
メッセージを送信してレンダリングするように指示します。これは非同期で、しばらくしてからすぐにWebViewの代理人がwebViewDidFinishLoad
という名前で呼び出されます。
NSDefaultRunLoopMode
またはUITrackingRunLoopMode
のいずれかを実行しているviewWillAppear
内のランループを実行して実験しました。これは、(それがトランザクション
以内というログ
[CATransactionの同期]に文句を言うが、作業を行う)が、デバイス上で、それは
webViewDidFinishLoad
が呼び出されないされないと、デッドロックシミュレータで動作します。(
UIWebView
ロードプロパティが動作しませんように。また、それはそうです。少なくとも、私はloadHTMLString:baseURL:
を呼び出すと、それは真実ではないコールバックを取得する前にした後。)ここでのソリューションの
"ローディング"プロパティは機能しますが、ロードはUIWebViewが画面に表示されて初めて実際に起動されます( 'webViewDidStartLoad'と' webViewDidFinishLoad'をトレースした場合)。ヒントは「0.01の不透明度を持つスクリーンにそれを追加する」と言いがちですが、それはオンスクリーンではないビューコントローラーには役立ちません。 –