在我的代码中,我试图在页面加载时显示UIWebView
,然后,当它完成时,从Web视图捕获图像以便稍后缓存和显示(所以我没有重新加载和呈现网页。)
我有以下几点:
CGContextRef context = CGBitmapContextCreate(…);
[[webView layer] renderInContext:context];
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];
我遇到的问题是,由于UIWebView
的平铺,有时在我捕获图像时,只有一半的页面会被渲染到上下文中。
有没有办法检测或阻止UIWebView
的背景渲染线程,这样我才能在所有渲染完成后才能获取图像?
更新:可能是线程竞争条件是红色鲱鱼(无论如何,文档中都不清楚UIWebView
的自定义图层或{{1}在其后台线程上的一般块中。)
这可能是失效问题(尽管在CATiledLayer
及其图层上对setNeedsDisplay
进行了多次调用)。在渲染之前更改UIWebView
的边界似乎已经消除了“不绘制整个事物”的问题。
我仍然遇到了一个问题,即在旧规模上绘制了几个图块,但是调用UIWebView
两次似乎已经足够了。
答案 0 :(得分: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. */
因此,您可以在调用renderInContext: