【问题标题】:How to capture screenshot of UIWebview with all the content?如何捕获包含所有内容的 UIWebview 的屏幕截图?
【发布时间】:2025-12-09 14:15:01
【问题描述】:

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

【问题讨论】:

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

标签: ios cocoa-touch uiwebview uikit


【解决方案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)
    最近更新 更多