2009-01-22 55 views
9

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

四处寻找我发现捕获UIView的最佳方式是检索其图层并使用renderInContext。

但是,UIWebView似乎正在使用自己的CALayer实现,它的表现更像CATiledLayer,虽然它仍然声称是标准的CALayer。当我打电话给renderInContext时,我只能得到网页的一部分,最多940px,而不是整个页面。

有没有人有任何想法如何强制UIWebView向下滚动另一个940px(显然这是远远不够理想)或告诉任何品种的CALayer它支持WebView呈现其所有内容时,我问它来。

干杯

编辑:我要补充一点,目前改变的WebView的框架以适应通过JavaScript检索页面大小。

回答

1

它在我看来像UIWebView根据需要呈现(当在大页面上快速向下滚动时见证棋盘),因此在用户滚动之前,在图层下方的部分中不会有任何东西在下面。图层将无法写出它没有的图像,所以我认为你不能捕捉整个区域。

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

+0

呀web视图充当如果它有CATiledLayer,并且一次只呈现大块,如果它是一个真正的CATiledLayer它不会是那么糟糕,因为我可以设置瓷砖的大小,但不幸的是,情况并非如此。 我正在试图滚动图层,但它不喜欢那个。 – 2009-01-23 09:25:03

1

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

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

0

所有UIViews都有1024x1024的大小限制,所以你可能会以编程方式滚动,以大块的形式捕捉页面,并以某种方式将它们缝合在一起。

9

我已经发布了一个应用程序(Web2Pic),请相信我,UIGraphicsBeginImageContext(webView.frame.size); 可以什么都不做,除了在我们的UIWebView ;-(

正确的做法是有点复杂的可视区域越来越小图像,但它只是工作:

1.使用的JavaScript在我们的UIWebView得到这些浮点值:。

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

2.Now我们可以“切割”整个页面分成几十个UIWebView的大小的小片,然后我们就可以分别捕捉每一个小块,然后把它们保存到我们的缓存我实现这通过计算ting page-offset并使用UIGraphicsBeginImageContext(webView.frame.size);获取图像数组。另外,您应该将图像数组缓存到文件系统中,否则应用程序最终会崩溃!我们可以开始一个全分辨率的上下文:UIGraphicsBeginImageContext(CGSizeMake(document.body.scrollWidth,document.body.scrollHeight));

4.Render每一个细小的图像转换为基于坐标的大背景下。而小心角落,在每一行的最后一个图像/行可能不是一个完整的图像。

俗语仍是一步到位左:保存大的图像。 不要将其保存到天地我的相簿,因为iOS的会自动降低图像的相册中的分辨率。相反,我们可以将其保存到文件系统,使应用程序的iTunes的文件共享支持,甚至写一个简单的应用程序内的照片管理器。

希望这些可以帮助;-)

已超峰季

+1

在步骤2中,您是否必须手动滚动网页视图?如果是这样,你如何做到这一点?正如Dany Greg在之前的评论中所说的那样? – vIceBerg 2011-10-10 22:15:27

2

设置的webview等于的webviewscrollviewcontentsize高度。

-(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; 
} 
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; 

}