我正在尝试捕获UIWebView的内容,包括用户不可见的内容。即使用户只看顶部,整个网页也是如此。
环顾四周,我发现捕获UIView的最佳方法是检索其图层并使用renderInContext。
然而,UIWebView似乎正在使用自己的CALayer实现,它的行为更像CATiledLayer,尽管它仍然声称是标准的CALayer。当我调用renderInContext时,我只获得网页的一部分,最多940px,而不是整页。
有没有人对如何做出任何想法:强制UIWebView向下滚动另一个940px(显然远非理想)或告诉它支持WebView的任何种类的CALayer在我问它时呈现其所有内容到。
干杯
编辑:我应该补充一点,目前更改webview的框架以适应通过javascript检索的页面大小。
答案 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,因此您可能会以编程方式滚动,以块的形式捕获页面,并以某种方式将它们拼接在一起。