将UIWebView呈现为ImageContext

时间:2009-01-22 16:10:09

标签: iphone cocoa-touch uiwebview

我正在尝试捕获UIWebView的内容,包括用户不可见的内容。即使用户只看顶部,整个网页也是如此。

环顾四周,我发现捕获UIView的最佳方法是检索其图层并使用renderInContext。

然而,UIWebView似乎正在使用自己的CALayer实现,它的行为更像CATiledLayer,尽管它仍然声称是标准的CALayer。当我调用renderInContext时,我只获得网页的一部分,最多940px,而不是整页。

有没有人对如何做出任何想法:强制UIWebView向下滚动另一个940px(显然远非理想)或告诉它支持WebView的任何种类的CALayer在我问它时呈现其所有内容到。

干杯

编辑:我应该补充一点,目前更改webview的框架以适应通过javascript检索的页面大小。

6 个答案:

答案 0 :(得分:9)

我发布了一个应用程序(Web2Pic),请相信我 UIGraphicsBeginImageContext(webView.frame.size); 除了从我们的UIWebView中的可见区域获取一个小图像之外什么都不做; - (

正确的方法有点复杂,但它只是有效:

1.在我们的UIWebView中使用 JavaScript 来获取这些浮点值:

   //Whole page size in HTML coordinate
   document.body.scrollWidth
   document.body.scrollHeight
   //UIWebView visible size in HTML coordinate
   window.innerWidth
   window.innerHeight

2.现在我们可以将整个页面“剪切”成几十个UIWebView大小的小块。然后我们可以单独捕获每个小块并将它们保存到我们的缓存中。我通过计算页面偏移量来实现这一点,并使用 UIGraphicsBeginImageContext(webView.frame.size); 来获取图像数组。此外,您应该将图像阵列缓存到文件系统中,否则应用程序最终会崩溃!

3.当我们最终获得所有小部分时,我们可以启动全分辨率上下文: UIGraphicsBeginImageContext(CGSizeMake(document.body.scrollWidth,document.body.scrollHeight));

4.将每个小图像放入基于坐标的大背景中。并且小心角落,每行/每行中的最后一张图片可能不是完整图片。

5.还有一步:保存大图像。 不要将其保存到PhotoAlbum ,因为iOS会自动降低相册中图像的分辨率。相反,我们可以将其保存到文件系统中并启用应用程序的 iTunes文件共享支持,甚至可以编写一个简单的应用程序内照片管理器。

希望这些可以提供帮助; - )

Yichao Peak Ji

答案 1 :(得分:2)

webview的高度设置为等于contentsize的{​​{1}}的{​​{1}}。

scrollview

答案 2 :(得分:1)

在我看来,UIWebView按需呈现(在大页面上快速向下滚动时见证棋盘),因此在用户向下滚动之前,图层部分下方不会有任何内容那里。该图层将无法写出它没有的内容,因此我认为您无法捕获整个区域。

就滚动而言,我没有任何明显暴露的API方法可以将其移除。 Web视图似乎托管了一个UIScrollView或类似的东西,您可以通过遍历视图层次结构并使用其scrollRectToVisible:animated:来尝试访问它,但这听起来不是一个好的长期解决方案。

答案 3 :(得分:1)

只是回答我的一个问题,你可以使用javascript滚动视图。

因此,您使用stringByEvaluatingJavaScriptFromString: javascript为window.scrollTo(0,%i);,其中%i是您要滚动到的位置。您还可以使用scrollY来检索当前滚动值。

答案 4 :(得分:1)

调整Webview的大小是我解决它的方式。如果您想要更大的图像和更多细节,您只需在调用此方法之前放大。请注意,大尺寸可能会影响性能。

- (UIImage*) imageFromWebview:(UIWebView*) webview{

//store the original framesize to put it back after the snapshot
CGRect originalFrame = webview.frame;

//get the width and height of webpage using js (you might need to use another call, this doesn't work always)
int webViewHeight = [[webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] integerValue];
int webViewWidth = [[webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] integerValue];

//set the webview's frames to match the size of the page
[webview setFrame:CGRectMake(0, 0, webViewWidth, webViewHeight)];

//make the snapshot
UIGraphicsBeginImageContextWithOptions(webview.frame.size, false, 0.0);
[webview.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

//set the webview's frame to the original size
[webview setFrame:originalFrame];

//and VOILA :)
return image;

}

答案 5 :(得分:0)

所有UIViews的大小限制为1024x1024,因此您可能会以编程方式滚动,以块的形式捕获页面,并以某种方式将它们拼接在一起。