2011-01-11 10 views
9

UIWebViewからレンダリングされたUIImageを入手する方法について知っている人がいますか?キャッチは、それはバックグラウンドスレッド上にある必要があります。バックグラウンドスレッドでUIWebViewをレンダリングしてUIImageを作成する -

私は詳しく説明します: 私は毎秒複数のUIWebViewsから画像を取得しようとしています+、そして画面上に表示します(もちろんiPhoneです)。 CGContextへのレイヤーのレンダリングはCPUを消費するジョブなので、メインスレッドを使用したくないので、UIをハングしないようにします。

私の試みは、これまであった。

  • 私はUIGraphicalContextへのWebViewの層の上にrenderInContextを使用しようとしましたが、_WebTryThreadLockエラーがwebviewsが墜落しました。

  • CGBitmapContextを作成して、webviewのレイヤーをレンダリングしましたが、同じ結果が得られました。

  • 私はメソッド(カテゴリを追加することによって)をCALayerに実装しようとしましたが、これはすべてのパブリックプロパティとサブレイヤを深くコピーしました。その後、私はコピーした層renderInContextに行きました。 部分的にの「正しい」UIImageを取得しました。つまり、すべてのレイヤーがレンダリングされているわけではありません。たとえば、Webサイトのヘッダー(またはフッター、ボディ、検索バー、またはフレーム)。 UIWebviewのレイヤーは、サブクラス化されたCALayersのすべての並べ替えで構成されているので、これはおそらくこれがうまくいきませんでした。

  • CATransactionkCATransactionDisableActionsを設定しようとしましたが、この動作は変更されていませんでした。

私はかなり諦めています。

あなたの中に救世主がいますか?

+0

+1タフな質問 –

答えて

4

UIWebViewは嫌いです。は、実際にはが嫌いです。バックグラウンドスレッドで何かが行われたことを意味します。 UIKitはスレッドセーフではありません。グラフィックスコンテキストへの描画は(これはiOS 4で追加されましたが)、セカンダリスレッドでUIViewを作成しないことです。

メインスレッドからUIWebViewを作成していますか?共有するコードがありますか?あなたの問題は、セカンダリスレッドでUIWebViewへの操作を実行しようとしているという事実によって引き起こされていると思われます。ビューの内容をイメージとしてレンダリングする描画操作は、がメインスレッドからはずれますが、ビュー自体を作成することはできません。

+3

私はメインスレッドでUIWebViewsを作成しています。私は "憎しみ"の部分についてさらに同意できませんでした;)また、グラフィックスコンテキストへの描画は可能ですが、残念ながら、UIWebViewレイアウトをレンダリングすると、特定の条件では、 UIWebView自体(メインスレッドではなく、iOSがそれを処理するために作成したもの)で、ロックがセカンダリスレッドによって行われたときに、そのスレッドがフリークアウトします。 UIWebViewレイアウトは、CALayer(WebLayerなど)のいくつかのプライベートAPIサブクラスでビルドされています。 – Gilbert

+0

私はwebviewsでこれまで同様の問題を抱えていましたが、シミュレータに限定されていますが、それはおそらくプライベートなサブクラスのどれかと関係があるでしょう。申し訳ありませんが私はより多くの助けができません。 – lxt

0

私もこれに取り組んできました。

スレッドでは、ビューの階層を作成し、Webビューのコンテンツのロードが完了するまでループします。

私が作成したのWebViewは、私が

if ([NSThread isMainThread] == NO) {[self performselectorOnMainThread: @selector(viewDidLoad)return;)} 

をやってみましたそして、私はWebViewのをdealloc'ingのために同じことをやったのUIViewControllerのviewdidload--の内側にあります。

しかし、それは動作しませんでした..私たちは自動解放プールを打つまで、私は私が理由を把握するための機器を使用しています...私たちはのUIWebViewの例外を避けること

を見つけました。

ここに私の攻撃戦略があります... メインスレッド上でレンダリング操作を実行するつもりですが、オフスクリーン表示で、別のスレッドにそれらを管理するキューを実行しています。私はUIの遅れを心配しているので、かなり効率的でなければならないでしょう。

+0

ええ、それはトリックです...独立したスレッドでレンダリングを作成するセレクタを実行し、補助スレッドのロードステータスを照会し、準備ができたらメインスレッドでレンダリングします。 – user438350

+2

これは基本的に私の現在の解決策です。しかし、それは良いものではありません。私はUIラグがあまりにも大きいので(そして、私がメインスレッドで行う唯一のことは実際のコアレンダリングプロセスです)。 – Gilbert

関連する問題