6

私のコードではUIWebView、ページが読み込まれているときに表示しようとしています。それが完了したら、Web ビューから画像をキャプチャしてキャッシュし、後で表示します (そのため、Web ページをリロードしてレンダリングする必要はありません)。 .

私は次のようなものを持っています:

CGContextRef context = CGBitmapContextCreate(…);
[[webView layer] renderInContext:context];

CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];

私が直面している問題は、UIWebViewのタイリングが原因で、画像をキャプチャするまでにページの半分しかコンテキストにレンダリングされないことがあります。

UIWebViewすべてのレンダリングが終了した後にのみ画像を取得できるように、 のバックグラウンド レンダリング スレッドを検出またはブロックする方法はありますか?


更新:スレッドの競合状態がレッドニシンだった可能性があります (いずれにせよ、UIWebViewカスタム レイヤーなのか、CATiledLayerバックグラウンド スレッドの一般的なブロックなのか、ドキュメントからは不明です)。

これは、代わりに無効化の問題である可能性があります (とそのレイヤーsetNeedsDisplayの両方でのいくつかの種類の呼び出しにもかかわらず)。UIWebViewレンダリングする前に の境界を変更するとUIWebView、「全体が描画されない」という問題が解消されたようです。

いくつかのタイルが古いスケールで描画されているという問題にまだ遭遇しましたが、renderInContext:2 回呼び出すことで十分に軽減されたようです。

4

1 に答える 1

0

UIWebView は、おそらく CATiledLayer またはカスタムの派生物を使用しています。レイヤーを、スレッド化された描画を行わない単純な CALayer など、独自に選択したものに置き換えることができる場合があります。コンテンツのロードを開始する前にレイヤーを置き換えます。

レイヤーを標準の CALayer に置き換えてもうまくいかない場合は、実際にスレッド化せずに CATiledLayer の動作をエミュレートする独自のサブクラスを作成する必要がある場合があります。

編集:

CATiledLayer.h から

/* Note: do not attempt to directly modify the `contents' property of
 * an CATiledLayer object - doing so will effectively turn it into a
 * regular CALayer. */

したがって、呼び出す前に内容を nil に設定できる場合がありますrenderInContext:

于 2010-05-10T04:15:08.207 に答える