当webview大于屏幕时,将UIWebview内容转换为UIImage

时间:2010-12-17 22:42:02

标签: iphone objective-c ios uiwebview uiimage

this question(以及this answer)非常相似,我正在尝试从webview中创建一个UIImage。到目前为止,我正在使用答案中建议的代码,具体来说:

UIGraphicsBeginImageContext(webview.bounds.size);
[webview.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

但是,当webview的内容大于屏幕时,生成的图像不完整且缺少补丁。关于如何解决这个问题的任何想法?

5 个答案:

答案 0 :(得分:18)

我得到了答案:

您必须在创建图像之前将Webview的框架设置为完整的内容大小。在此之后,只需将尺寸设置回原点:

+ (UIImage *) imageFromWebView:(UIWebView *)view
{
    // tempframe to reset view size after image was created
    CGRect tmpFrame         = view.frame;

    // set new Frame
    CGRect aFrame               = view.frame;
    aFrame.size.height  = [view sizeThatFits:[[UIScreen mainScreen] bounds].size].height;
    view.frame              = aFrame;

    // do image magic
    UIGraphicsBeginImageContext([view sizeThatFits:[[UIScreen mainScreen] bounds].size]);

    CGContextRef resizedContext = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:resizedContext];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    // reset Frame of view to origin
    view.frame = tmpFrame;
    return image;
}

答案 1 :(得分:5)

D R的答案很好。唯一缺少的是考虑到屏幕的比例。我已经在 Swift 版本中更正了它,它对我来说很好。

extension UIWebView{
func snapshotForCompletePage() -> UIImage {
    // tempframe to reset view size after image was created
    let tmpFrame: CGRect = self.frame
    // set full size Frame
    var fullSizeFrame: CGRect = self.frame
    fullSizeFrame.size.height = self.scrollView.contentSize.height
    self.frame = fullSizeFrame

    // here the image magic begins
    UIGraphicsBeginImageContextWithOptions(fullSizeFrame.size, false, UIScreen.mainScreen().scale)
    let resizedContext: CGContextRef = UIGraphicsGetCurrentContext()!
    self.layer.renderInContext(resizedContext)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    // reset Frame of view to origin
    self.frame = tmpFrame
    return image
      }
    }

答案 2 :(得分:2)

@ Jibeex的回答对我有用。但我必须添加以下代码

    fullSizeFrame.size.width = self.scrollView.contentSize.width

以下

    fullSizeFrame.size.height = self.scrollView.contentSize.height

让它充分发挥作用。写作答案,因为我没有足够的声誉来评论。

答案 3 :(得分:0)

我认为这可能会有所帮助

UIGraphicsBeginImageContext([webView sizeThatFits:[[UIScreen mainScreen] bounds].size]]);

答案 4 :(得分:0)

如果有人在Xamarin中苦苦挣扎,请根据@DR回答,这是代码:

var image = new UIImage();

var previousFrame = _tableView.Frame;
var newFrame = new CGRect(new CGPoint(0, 0), _tableView.ContentSize);
View.Frame = newFrame;

UIGraphics.BeginImageContextWithOptions(_tableView.ContentSize, false, UIScreen.MainScreen.Scale);
var context = UIGraphics.GetCurrentContext();
View.Layer.RenderInContext(context);
image = UIGraphics.GetImageFromCurrentImageContext();

UIGraphics.EndImageContext();

View.Frame = previousFrame;


return image;