如何判断UIWebView何时完成绘制到上下文?

时间:2010-05-10 03:57:23

标签: iphone uiwebview cgcontext core-graphics

在我的代码中,我试图在页面加载时显示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两次似乎已经足够了。

1 个答案:

答案 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:

之前将内容设置为nil