2009-06-01 10 views
8

私はいくつかのビューコントローラでUIWebViewsを使用するアプリケーションを持っています。 UIWebViewsは、ローカルに生成されたhtmlをレンダリングするために使用され、遅いネットワークアクセスは必要ありません。webViewDidFinishLoadまでviewWillAppearを延期する

メモリを節約するため、私はviewcontroller viewWillAppearコールバックのプロンプトに従ってオンデマンドでのみロードします。 didReceiveMemoryWarningメッセージに応答してオフスクリーンインスタンスをアンロードします。

問題は、レンダリングされるhtmlが表示され、時にはスタイリングやその他の不愉快なアーティファクトが伴って表示されることです。むしろレンダリングはオフスクリーンで行い、完全にレンダリングされたビューはその準備ができたら明らかにします。

UIWebViewが完全にレンダリングされるまでviewWillAppearが返されないようにすることは非常に整然としたことです。しかしどうですか?

私はUIWebViewに、loadHTMLString:baseURL:メッセージを送信してレンダリングするように指示します。これは非同期で、しばらくしてからすぐにWebViewの代理人がwebViewDidFinishLoadという名前で呼び出されます。

NSDefaultRunLoopModeまたはUITrackingRunLoopModeのいずれかを実行しているviewWillAppear内のランループを実行して実験しました。これは、(それがトランザクション

以内というログ

[CATransactionの同期]に文句を言うが、作業を行う)が、デバイス上で、それはwebViewDidFinishLoadが呼び出されないされないと、デッドロックシミュレータで動作します。

UIWebViewロードプロパティが動作しませんように。また、それはそうです。少なくとも、私はloadHTMLString:baseURL:を呼び出すと、それは真実ではないコールバックを取得する前にした後。)ここでのソリューションの

+0

"ローディング"プロパティは機能しますが、ロードはUIWebViewが画面に表示されて初めて実際に起動されます( 'webViewDidStartLoad'と' webViewDidFinishLoad'をトレースした場合)。ヒントは「0.01の不透明度を持つスクリーンにそれを追加する」と言いがちですが、それはオンスクリーンではないビューコントローラーには役立ちません。 –

答えて

3

ロット私は思います。簡単な方法は、隠しプロパティをYESに設定してUIWebViewを読み込むことです。そして、UIWebViewsデリゲートとしてあなたのUIViewControllerを設定し、実装する:あなたが戻ってNOにプロパティを設定し

- (void)webViewDidFinishLoad:(UIWebView *)webView

フレームに埋め込まれたコンテンツがある場合、webViewDidFinishLoadは複数回発生することに注意してください。だからあなたはこれを追跡しなければならない。ローカルコンテンツを読み込んでいる場合は、本当に問題にならないはずです。

+0

このソリューションでは、ページが表示されている間に空白の表示を見ていますオフスクリーンで描かれる。 (私のアプリケーションでは、透過的なページが表示される背景があるので、見るべきものですが...) コントロール要素を表示する他のアプリケーションをモデル化する方が良いでしょう)がレンダリングされている間に押され、次にレンダリングされた完全なビューがアニメーション化されます。 – cluesque

+0

次に、ボタンのターゲット/セレクタでレンダリングを駆動させ、終了時にページを前進させます(webViewDidFinishLoad:monowerkerが示唆するように) –

+0

webViewDidFinishLoad:UIWebViewを画面上に移動してから呼び出されます。 –

0

私はmonowerkerのソリューションが一番好きですが、もう一つの解決策は、常にレンダリングされたUIWebViewを(View Controllerよりも永久オブジェクトで)保持することです。私はmonowerkerのソリューションの外観があまりにも混乱している場合にのみそれを行うだろう。

+0

UIWebViewは、多くのメモリを消費し、低メモリ警告が発生したときにはじめて船に投げ込まれます。 私の使用事例の1つは、リストビューから選択したオブジェクトの詳細をレンダリングすることです(メッセージのリストを参照してメールをタップして全体を読むなど)。見ることができる。 – cluesque

関連する問題