9

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

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

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

有没有人有任何想法:强制 UIWebView 向下滚动另一个 940px(显然这远非理想),或者当我要求它时告诉它支持 WebView 的任何种类的 CALayer 来呈现其所有内容。

干杯

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

4

6 回答 6

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 文件共享支持,甚至可以编写一个简单的应用程序内照片管理器。

希望这些可以帮助;-)

易潮峰姬

于 2011-08-05T02:07:09.277 回答
2

将的高度设置webviewcontentsizescrollviewwebview

-(UIImage *)captureImage:(UIWebView *)webvw
{
    webvw.frame=CGRectMake(webvw.frame.origin.x, webvw.frame.origin.y, webvw.frame.size.width, webvw.scrollView.contentSize.height);
    UIGraphicsBeginImageContextWithOptions(webvw.frame.size, NO, 0.0f);
    [webvw.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    return screenshot;
}
于 2013-08-07T12:42:26.417 回答
1

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

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

于 2009-01-22T22:59:26.633 回答
1

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

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

于 2009-01-23T09:52:08.703 回答
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;

}

于 2014-02-19T15:56:47.983 回答
0

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

于 2009-02-04T10:07:55.127 回答