Преобразуйте содержимое UIWebview в UIImage, когда веб-представление больше экрана - PullRequest
7 голосов
/ 18 декабря 2010

Очень похоже на этот вопрос (а также этот ответ ), я пытаюсь сделать UIImage из веб-просмотра.Пока что я использую код, предложенный в ответе, а именно:

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

Однако, когда содержимое веб-просмотра больше экрана, получающиеся изображения не являются полными и имеют отсутствующие исправления.Есть идеи как это исправить?

Ответы [ 4 ]

18 голосов
/ 24 февраля 2011

Я получил ответ:

Вы должны установить рамку веб-просмотра на полный размер контента непосредственно перед созданием изображения.После этого просто установите размер обратно на начало координат:

+ (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;
}
5 голосов
/ 22 января 2016

DR ответит хорошо.Единственное, чего не хватает, так это учета масштаба экрана.У меня исправлено в моей 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 голосов
/ 11 октября 2017

@ Ответ Jibeex работал на меня.Но мне пришлось добавить следующий код

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

ниже

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

, чтобы он полностью работал.Пишу как ответ, потому что у меня недостаточно репутации, чтобы комментировать.

0 голосов
/ 24 февраля 2011

Я думаю, что это может помочь

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