6

在我的代码中,我试图将 a 显示UIWebView为正在加载的页面,然后,完成后,从 Web 视图中捕获图像以缓存并稍后显示(因此我不必重新加载和呈现网页) .

我有一些类似的东西:

CGContextRef context = CGBitmapContextCreate(…);
[[webView layer] renderInContext:context];

CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];

我遇到的问题是,由于UIWebView's 平铺,有时在我捕获图像时只有一半的页面呈现到上下文中。

有没有办法检测或阻止UIWebView的后台渲染线程,以便只有在所有渲染完成后才能获取图像?


更新:线程竞争条件可能是一个红鲱鱼(从文档中不清楚,无论如何,是UIWebView自定义层还是CATiledLayer后台线程上的一般块)。

相反,这可能是一个失效问题(尽管setNeedsDisplay在 theUIWebView及其层上都有多种调用)。在渲染之前更改边界UIWebView似乎已经消除了“不绘制整个事物”的问题。

我仍然遇到了一个问题,即以旧比例绘制了一些瓷砖,但调用renderInContext:两次似乎已经充分缓解了这一问题。

4

1 回答 1

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. */

所以你可以在调用之前将内容设置为 nilrenderInContext:

于 2010-05-10T04:15:08.207 回答