Convert UIWebview contents to a UIImage when the webview is larger than the screen

后端 未结 5 1156
孤城傲影
孤城傲影 2020-12-02 19:20

Very similar to this question (and also this answer), I\'m trying to make an UIImage out from a webview. So far I\'m using the code suggested in the answer, specifically: <

相关标签:
5条回答
  • 2020-12-02 19:59

    I think this could help

    UIGraphicsBeginImageContext([webView sizeThatFits:[[UIScreen mainScreen] bounds].size]]);
    
    0 讨论(0)
  • 2020-12-02 20:04

    @Jibeex's answer worked for me. But I had to add the following code

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

    below

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

    for it to fully work. Writing as answer because I don't have enough reputation to comment.

    0 讨论(0)
  • 2020-12-02 20:11

    If someone is struggling how to do this in Xamarin, based on @DR answer, here is the code:

    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;
    
    0 讨论(0)
  • 2020-12-02 20:20

    D R's answer is fine. The only thing missing is taking into account the scale of screen. I have it corrected in my Swift version and it works fine for me.

    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
          }
        }
    
    0 讨论(0)
  • 2020-12-02 20:24

    I got the answer:

    You have to set the frame of the Webview to the full content size just before you create the image. After this just set the size back to origin:

    + (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;
    }
    
    0 讨论(0)
提交回复
热议问题