如何捕获包含所有内容的 UIWebview 的屏幕截图?

Posted

技术标签:

【中文标题】如何捕获包含所有内容的 UIWebview 的屏幕截图?【英文标题】:How to capture screenshot of UIWebview with all the content? 【发布时间】:2012-04-19 09:54:25 【问题描述】:

我能够截取整个网页的屏幕截图(包括屏幕外内容)。这在模拟器上运行良好,但在设备上却崩溃了。请帮助我,检查下面的代码(browserView 是 UIWebview)。

UIImage *screenImage=[[UIImage alloc] init];
UIScrollView *browserScrollableView=[[UIScrollView alloc] init];
browserScrollableView=browserView.scrollView;   
UIGraphicsBeginImageContext(browserScrollableView.contentSize);
CGPoint savedContentOffset = browserScrollableView.contentOffset;
CGRect savedFrame = browserScrollableView.frame;

browserScrollableView.contentOffset = CGPointZero;
browserScrollableView.frame = CGRectMake(0, 0, browserScrollableView.contentSize.width, browserScrollableView.contentSize.height);

[browserScrollableView.layer renderInContext: UIGraphicsGetCurrentContext()];     
screenImage = UIGraphicsGetImageFromCurrentImageContext();

browserScrollableView.contentOffset = savedContentOffset;
browserScrollableView.frame = savedFrame;
UIGraphicsEndImageContext();

NSLog(@"Captured image size is %f X %f",screenImage.size.width,screenImage.size.height);

UIImageWriteToSavedPhotosAlbum(screenImage, nil, nil, nil);

【问题讨论】:

***.com/questions/469764/… @AnkitGupta 谢谢。此解决方案不适用于所有情况,因为所有网站的设计都不相同。如果网页没有body标签并且基于一些js加载,那么这将不起作用(如果我没记错的话) 是的,Anil,你说得对,我没有使用它,但我试图解决你的问题,它适用于你的情况吗?? @AnkitGupta 我没有使用任何特定的网站/页面。理想情况下,我的屏幕截图应该适用于所有类型的页面。我的代码在模拟器上完美运行,我不明白为什么它在设备上崩溃??? :( 与您的问题没有直接关系,但您最好将 UIGraphicsBeginImageContext(browserScrollableView.contentSize); 替换为 UIGraphicsBeginImageContextWithOptions(browserScrollableView.contentSize, NO, 0.0); 请参阅:UIKit Function Reference。另外:如果您在后台线程上调用它,这可能是崩溃的原因。 【参考方案1】:
+ (UIImage*) captureWebView: (UIWebView*)webView 
    // capture webview
    UIImage *img = nil;
    UIGraphicsBeginImageContextWithOptions(webView.scrollView.contentSize, webView.scrollView.opaque, 0.0);
    
        CGPoint savedContentOffset = webView.scrollView.contentOffset;
        CGRect savedFrame = webView.scrollView.frame;

        webView.scrollView.contentOffset = CGPointZero;
        webView.scrollView.frame = CGRectMake(0, 0, webView.scrollView.contentSize.width, webView.scrollView.contentSize.height);
        [webView.scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
        img = UIGraphicsGetImageFromCurrentImageContext();

        webView.scrollView.contentOffset = savedContentOffset;
        webView.scrollView.frame = savedFrame;
    
    UIGraphicsEndImageContext();
    return img;

【讨论】:

【参考方案2】:

我正在使用此功能及其对我的工作

-(UIImage*)captureScreen:(UIView*) viewToCapture

    UIGraphicsBeginImageContext(viewToCapture.bounds.size);
    [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;

参数“viewToCapture”将是您的 webView。

【讨论】:

我也想要来自 webview 的隐藏/越界内容,这就是我使用滚动视图的原因。 很抱歉造成误解。【参考方案3】:
browserScrollableView=browserView.scrollView;

是 NS_AVAILABLE_ios(5_0);

检查您的设备 iOS 版本。

【讨论】:

您能否添加更多信息向 OP 解释您的建议? UIWebView 的属性 scrollView 是 NS_AVAILABLE_IOS(5_0);尝试检查 browserView respondeToSelector:@selector(scrollView)

以上是关于如何捕获包含所有内容的 UIWebview 的屏幕截图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UITableView 创建包含 UIWebView 的可滚动视图

拍摄 UIWebView 的快照/屏幕截图

无法在 Xamarin IOS 中捕获 WkWebView 的屏幕

当用户单击 UIWebView 内的文本字段时,出现键盘后屏幕不会向上移动

如何在屏幕抓取中捕获鼠标光标?

如何使来自 UIWebView 的音频静音