通过在后台线程 – iPhone上渲染UIWebView来创buildUIImage
是否有人知道如何获得从UIWebView呈现的UIImage的方式或创意? 问题在于,这必须在后台线程上。
我将详细说明:我试图从多个UIWebViews每秒获取图像 – ,并将其显示在屏幕上(当然是iPhone)。 因为渲染一个图层到CGContext是一个CPU消耗的工作,我不想使用主线程,所以不要挂用户界面。
我到目前为止的尝试是:
-
我试图在webView的图层上使用
renderInContext
到UIGraphicalContext
,但是_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理它们。 我担心用户界面滞后,所以它必须相当有效。
- 用UILabel文本掩码显示UIView
- iOS CAlayer方向AVCaptureVideoPreviewLayer不旋转
- 当CAEmitterLayer结束CAEmitter单元的生命周期时,如何移除CAEmitterLayer – 而不是直到从超级层中移除CAEmitterLayer
- 我怎样才能一个接一个地链接不同层的核心animation?
- 在UITableViewCell的子视图上设置遮罩层将覆盖自动布局约束
- 在UITableViewCell上绘制阴影
- CALayer的抗混叠对angular线边缘
- iOS9上的CALayerInvalidGeometry崩溃“非有限位置的子图层”
- drawRect:/ renderInContext:问题