2010-05-10 76 views
6

在我的代码中,我试图在页面加载时显示一个UIWebView,然后,当它完成时,从Web视图中捕捉图像以便稍后缓存和显示(所以我不必重新加载并渲染网页)。如何知道UIWebView何时完成对上下文的绘制?

我沿着线的东西:

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

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

我遇到的问题是,由于UIWebView的瓷砖,有时只在页面的一半是由时间呈现给上下文我捕捉到了图像。

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


UPDATE:这可能是线程竞争条件是一个红鲱鱼(这是从文档不清晰,在任何情况下,无论是UIWebView的定制层或一般块CATiledLayer其后台线程) 。

这可能是一个失效问题(尽管在UIWebView及其图层上对setNeedsDisplay进行了几种调用)。在渲染之前更改UIWebView的界限似乎消除了“不能绘制整个事物”的问题。

我仍然遇到了一个问题,即在旧秤上绘制几块瓷砖,但两次调用renderInContext:似乎已经充分缓解了这一问题。

回答

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

所以,你可能只能够设置内容为nil调用renderInContext:

相关问题