如何捕获包含所有内容的 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 的可滚动视图
无法在 Xamarin IOS 中捕获 WkWebView 的屏幕