8

複数のViewControllerで使用するアプリケーションがありますUIWebViews。はUIWebViewsローカルで生成されたhtmlをレンダリングするために使用され、低速のネットワークアクセスは必要ありません。

メモリを節約するために、viewcontrollerviewWillAppearコールバックによってプロンプトが表示されたときにオンデマンドでのみこれらをロードします。(そして、メッセージに応答してオフスクリーンインスタンスをアンロードしdidReceiveMemoryWarningます。)

問題は、ユーザーがHTMLがレンダリングされているのを見ることができることです。これには、スタイリングのフラッシュやその他の不快なアーティファクトが伴う場合があります。むしろ、レンダリングを画面外で行い、準備ができたら完全にレンダリングされたビューを表示したいと思います。

viewWillAppearUIWebViewが完全にレンダリングされるまで、戻ってこないようにすることができるのは非常に整然としています。しかし、どのように?

UIWebViewメッセージを送信して、何をレンダリングするかを指示しloadHTMLString:baseURL:ます。これは非同期であり、しばらくして(すぐに)WebviewのデリゲートがコールバックされますwebViewDidFinishLoad

、またはviewWillAppearのいずれかを実行して、内部でrunloopを実行してみました。これはシミュレーターで機能します(ログに文句を言いますNSDefaultRunLoopModeUITrackingRunLoopMode

[CATransaction同期]トランザクション内で呼び出されます

ただし、機能します)が、デバイスではデッドロックが発生し、webViewDidFinishLoad呼び出されることはありません。

(また、UIWebViewloadingプロパティが機能していないようです。少なくとも、呼び出した後loadHTMLString:baseURL:、コールバックを取得する前は、正しくありません。)

4

2 に答える 2

3

ここにはたくさんの解決策があると思います。簡単な方法は、非表示のプロパティを YES に設定して UIWebView をロードすることです。次に、UIViewController を UIWebViews デリゲートとして設定し、実装します。

- (void)webViewDidFinishLoad:(UIWebView *)webView

プロパティを NO に戻します。

注意すべきことは、フレーム化/埋め込みコンテンツがある場合、webViewDidFinishLoad が複数回起動することです。したがって、これを追跡する必要があります。ローカル コンテンツを読み込んでいる場合は、特に問題になることはありません。

于 2009-06-01T03:38:58.733 に答える
0

私は monowerker のソリューションが一番気に入っていますが、別の解決策は、既にレンダリングされた UIWebView を常に保持することです (View Controller よりも永続的なオブジェクトで)。monowerker のソリューションの外観が破壊的すぎる場合にのみ、私はそれを行います。

于 2009-06-02T04:41:50.297 に答える