通过在后台线程 – iPhone上渲染UIWebView来创buildUIImage

是否有人知道如何获得从UIWebView呈现的UIImage的方式或创意? 问题在于,这必须在后台线程上。

我将详细说明:我试图从多个UIWebViews每秒获取图像 – ,并将其显示在屏幕上(当然是iPhone)。 因为渲染一个图层到CGContext是一个CPU消耗的工作,我不想使用主线程,所以不要挂用户界面。

我到目前为止的尝试是:

  • 我试图在webView的图层上使用renderInContextUIGraphicalContext ,但是_WebTryThreadLock错误使webviews崩溃。

  • 我试图创build一个CGBitmapContext ,并呈现webview的图层,但得到了相同的结果。

  • 我尝试了一个copy方法(通过添加一个类别) CALayer ,深层复制所有的公共属性和子层。 之后,我尝试renderInContext我复制的图层。 我得到了一个部分 “正确”的UIImage – 意思是,并不是所有的图层都被渲染,例如,我只能得到网站的页眉(或页脚,或正文,或search栏,或只是一些框架)。 UIWebview的图层由各种types的CALayers组成,所以这可能是为什么这个接近不起作用。

  • 我尝试在kCATransactionDisableActions中设置CATransaction ,但似乎并没有改变这种行为(两者都没有)。

我相当接近放弃。

你们中间有救世主吗?

UIWebView讨厌,我的意思是非常讨厌 ,在后台线程上做了什么。 UIKit不是完全线程安全的。 绘制到graphics上下文是(这是在iOS 4中添加),但不是在辅助线程上创buildUIViews。

你是否在主线程中创build了UIWebView? 你也许有一些代码分享? 我怀疑你的问题是由于你试图在辅助线程上对UIWebView执行操作而引起的。 将视图内容呈现为图像的绘制操作可能发生在主线程之外,但是创build视图本身不能。

我也一直在努力。

在一个线程中,我创build一个视图层次结构,直到Web视图完成加载内容。

我创build的webview是在UIViewController的viewdidload里面 – 我试过了

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

我已经做了同样的dealloc'ing webView。

但是,这并没有工作..我只发现我们避免UIWebViewexception,直到我们打到autorelease池…

我正在使用工具来找出原因

这里是我的攻击策略…我要在主屏幕上执行渲染操作,使用单独的线程运行某种队列来pipe理它们。 我担心用户界面滞后,所以它必须相当有效。