Как получить ВСЁ изображение из UIWebView, включая контент вне экрана - PullRequest
3 голосов
/ 27 марта 2012

У меня есть метод, который я использую, чтобы получать изображения из различных представлений в моем приложении iOS, чтобы позволить пользователям отправлять сообщения по электронной почте на экраны.Большинство экранов, на которых я рисую, работают нормально, но когда я использую эту технику с UIWebView, я получаю только видимую часть экрана.Все, что находится за пределами экрана, не входит в отображаемое изображение.Копались здесь, в стеке, но пока ничего не нашло работ?!

Вот метод, который я сейчас использую:

-(NSData *)getImageFromView:(UIView *)view
{
    NSData *pngImg;
    CGFloat max, scale = 1.0;
    CGSize size = [view bounds].size;

    // Scale down larger images else we run into mem issues with mail widget
    max = (size.width > size.height) ? size.width : size.height;
    if( max > 960 )
        scale = 960/max;

    UIGraphicsBeginImageContextWithOptions( size, YES, scale );

    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];    
    pngImg = UIImagePNGRepresentation( UIGraphicsGetImageFromCurrentImageContext() );

    UIGraphicsEndImageContext();    
    return pngImg;
}

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

Ничего себе, ответ был глупо прост ... копался повсюду, просматривая различные материалы, связанные с печатью / PDF ... потом мне пришло в голову, почему бы просто не установить представление В КОНТЕКСТЕ на sizeThatFits.Это сработало!

ПРЕДУПРЕЖДЕНИЕ: Нет гарантии, что вы не столкнетесь с проблемами памяти с этим, и я действительно рекомендую вам сделать это в пуле @autoreleasepool и рассмотреть возможность некоторого масштабирования, как я делаю в примере, но ЭТО РАБОТАЕТи вот на чем я остановился:

-(NSData *)getImageFromView:(UIView *)view  // Mine is UIWebView but should work for any
{
    NSData *pngImg;
    CGFloat max, scale = 1.0;
    CGSize viewSize = [view bounds].size;

    // Get the size of the the FULL Content, not just the bit that is visible
    CGSize size = [view sizeThatFits:CGSizeZero];

    // Scale down if on iPad to something more reasonable
    max = (viewSize.width > viewSize.height) ? viewSize.width : viewSize.height;
    if( max > 960 )
        scale = 960/max;

    UIGraphicsBeginImageContextWithOptions( size, YES, scale );

    // Set the view to the FULL size of the content.
    [view setFrame: CGRectMake(0, 0, size.width, size.height)];

    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];    
    pngImg = UIImagePNGRepresentation( UIGraphicsGetImageFromCurrentImageContext() );

    UIGraphicsEndImageContext();
    return pngImg;    // Voila an image of the ENTIRE CONTENT, not just visible bit
}
1 голос
/ 28 марта 2012

Я создал категорию для этого некоторое время назад.Это работает, если (и только если) веб-представление кэшируется в памяти, в противном случае части страницы будут отображаться белым цветом.

#import "UIWebView+Screenshot.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIWebView (Screenshot)

- (UIImage *)screenshot {
UIImage *img = nil;

    UIGraphicsBeginImageContextWithOptions(self.scrollView.contentSize, self.scrollView.opaque, 0.0);
    {
        CGPoint savedContentOffset = self.scrollView.contentOffset;
        CGRect savedFrame = self.scrollView.frame;

        self.scrollView.contentOffset = CGPointZero;
        self.scrollView.frame = CGRectMake(0, 0, self.scrollView.contentSize.width, self.scrollView.contentSize.height);
        [self.scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
        img = UIGraphicsGetImageFromCurrentImageContext();

        self.scrollView.contentOffset = savedContentOffset;
        self.scrollView.frame = savedFrame;
    }
    UIGraphicsEndImageContext();

    return img;
}

@end
0 голосов
/ 27 марта 2012

Вы можете уменьшить uiwebview так, чтобы весь контент помещался на экране ... но это будет работать, только если изображение находится вне экрана по горизонтали. Если UIWebView длиннее экрана, это мало что даст.

[webview.scrollView setZoomScale:webview.scrollView.minimumZoomScale animated:NO];
...