Web视图中的灰色区域

时间:2014-05-12 13:08:15

标签: ios scrollview snapshot

我试图保存整个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%是空的,灰色。

1 个答案:

答案 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];
    }
}