2012-03-26 8 views
3

iOSアプリケーションのさまざまなビューから画像を取得してユーザーに電子メール画面を送信する方法があります。私が描くスクリーンの大部分は正常に動作していますが、このテクニックをUIWebViewで使用すると、画面の表示部分だけが表示されます。画面外のものはレンダリングされたイメージには含まれません。ここでスタックを掘っていたが、これまでに何も見つからなかったのだろうか?ここで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; 
} 

答えて

5

うわー答えはただのコンテキストでビューを設定していない理由、それは、私に起こった...各種印刷/ PDF関連のものを見ているすべての場所で掘った...愚かな単純なものでしたsizeThatフィット。出来た!

警告:これとmemの問題を実行しないことを保証するものではありません。この例では@autoreleasepoolプール内でこれを行い、いくつかスケーリングを行うことをお勧めしますが、これは私が解決したものですon:

-(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 
} 
+0

FYI - これは大きなページでは遅くなることがありますが、[バックグラウンドキューでレンダリングできます](http://stackoverflow.com/a/10954342/168594)。 (ただし、メインキューでフレーム操作を行う必要があります。 – zekel

0

すべてのコンテンツが画面に収まる...しかし画像が水平方向に画面の外にある場合にのみ動作するようにあなたがのUIWebViewをズームアウトができます。 UIWebViewが画面より長い場合、これはあまり効果がありません。

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

ありがとうございますが、残念ながらほとんどのコンテンツは垂直方向です。 –

1

これまでのカテゴリを作成しました。ウェブビューがメモリにキャッシュされている場合にのみ動作します。そうしないと、ページの一部が白く表示されます。

#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

Thx、私はちょうどそれを別の方法で解決しました。上記を参照。 –

関連する問題