我试图保存整个UIWebView的屏幕截图。但是:如果网页很长,有很多javascript或动态对象,如果我不手动(并耐心!)滚动所有页面,webview永远不会加载一些灰色和永久卸载的区域。 如何加载整个网页?或者这是一个不同的问题? 互联网上没有任何东西可以帮助我。 谢谢。
更新
这是我目前在" PrintButton"中所做的事情。 IBAction为:
// save old frame of webView
CGPoint savedContentOffset = _webPage.scrollView.contentOffset;
CGRect savedFrame = _webPage.scrollView.frame;
CGSize webPageSize = CGSizeMake(_webPage.scrollView.contentSize.width, _webPage.scrollView.contentSize.height);
CGRect stringRect = CGRectMake(0, 0, webPageSize.width, webPageSize.height);
// set new frame
_webPage.scrollView.contentOffset = CGPointZero;
_webPage.scrollView.frame = stringRect;
UIGraphicsBeginImageContextWithOptions(webPageSize,NO,1.0);
[_webPage.scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
self.viewImage = UIGraphicsGetImageFromCurrentImageContext();
// re-set old frame
_webPage.scrollView.contentOffset = savedContentOffset;
_webPage.scrollView.frame = savedFrame;
UIGraphicsEndImageContext();
// save in gallery
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
代码有效:图片保存在我的照片库中。但正如所说,如果网页非常复杂,冗长,重,我不知道什么,空白区域(我说灰色,因为webview的背景是灰色的)将出现。 通常,如果我在按下打印按钮之前没有滚动页面,那么我没有滚动的页面的95%是空的,灰色。
答案 0 :(得分:0)
我尝试了几种解决这个问题的方法,并发现了两个似乎使其更好的关键变化。
首先,我在renderInContext
上运行_webView
而不是_webView.scrollView
。另一个是我通过调用scrollRectToVisible:animated:
而不是手动设置contentOffset
来调整内容的偏移量。
查看抓取一系列图像并将其保存到相机胶卷的示例代码。通过一些修改,您可以将图像输出到单个高视图中,并将其另存为单个连续图像。
请注意,这假设网页只需垂直滚动,而不是水平滚动。
- (void) printScreen {
// this is a method that starts the screenshot taking process
// this line is necessary to capture the completion of the scrollView animation
_webView.scrollView.delegate = self;
// save the first image
UIGraphicsBeginImageContextWithOptions(_webView.bounds.size, NO, 0);
[_webView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
// scroll to the next section
[_webView.scrollView scrollRectToVisible:CGRectMake(0, _webView.frame.size.height, _webView.frame.size.width, _webView.frame.size.height) animated:YES];
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
// at this point the webView scrolled to the next section
// I save the offset to make the code a little easier to read
CGFloat offset = _webView.scrollView.contentOffset.y;
UIGraphicsBeginImageContextWithOptions(_webView.bounds.size, NO, 0);
// note that the below line will not work if you replace _webView.layer with _webView.scrollView.layer
[_webView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
// if we are not done yet, scroll to next section
if (offset < _webView.scrollView.contentSize.height) {
[_webView.scrollView scrollRectToVisible:CGRectMake(0, _webView.frame.size.height+offset, _webView.frame.size.width, _webView.frame.size.height) animated:YES];
}
}