如何对包含所有内容的UIWebview进行截屏?

5

我能够捕获整个网页的截图(包括屏幕外的内容)。这在模拟器上运行良好,但在设备上会崩溃。请帮我解决这个问题,检查下面的代码(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);

https://dev59.com/ukbRa4cB1Zd3GeqPzFCr - Ankit Gupta
@AnkitGupta 谢谢。这个解决方案并不适用于所有情况,因为不是所有网站的设计都相同。如果网页没有body标签,并且是基于某些js加载的,则此方法将无法使用(如果我没记错的话)。 - Anil Kumar
是的,Anil,你说得对,我没有使用它,但我正在尝试解决你的问题,它在你的情况下有效吗? - Ankit Gupta
@AnkitGupta 我没有使用任何特定的网站/页面。理想情况下,我的截图应该适用于所有类型的页面。我的代码在模拟器上完美运行,我不知道为什么在设备上会崩溃???:( - Anil Kumar
与您的问题无直接关系,但最好将 UIGraphicsBeginImageContext(browserScrollableView.contentSize); 替换为 UIGraphicsBeginImageContextWithOptions(browserScrollableView.contentSize, NO, 0.0); 参考:UIKit函数参考。此外:如果您在后台线程调用此方法可能是崩溃的原因。 - Rok Jarc
3个回答

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

3
我正在使用这个函数,它对我有用。
-(UIImage*)captureScreen:(UIView*) viewToCapture
{
    UIGraphicsBeginImageContext(viewToCapture.bounds.size);
    [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}

参数"viewToCapture"将是您的webView。

我想要从webview中获取隐藏/越界的内容,这就是我使用scrollview的原因。 - Anil Kumar
对于误解感到抱歉。 - Malek_Jundi

1
browserScrollableView=browserView.scrollView;

是否可用NS_AVAILABLE_IOS(5_0);

检查您的设备iOS版本。


你能添加更多的信息来解释你的建议给OP吗? - Paul Richter
UIWebView的属性scrollView是NS_AVAILABLE_IOS(5_0)。 尝试检查browserView是否响应ToSelector:@selector(scrollView)。 - user1723251

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接