2013-11-25 11 views
24

snapshotViewAfterScreenUpdatesで作成されたUIViewからUIImageを取得することはできますか?UIImageからsnapshotViewAfterScreenUpdatesで作成されたUIView:

A UIViewのは snapshotViewAfterScreenUpdatesから返さ

サブビューとして追加する場合罰金に見えますが、以下は黒画像を生成します。

UIView *snapshotView = [someView snapshotViewAfterScreenUpdates:YES]; 
UIImage *snapshotImage = [self imageFromView:snapshotView]; 

- (UIImage *)imageFromView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0); 
    // [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- same result... 
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return img; 
} 

snapshotViewAfterScreenUpdatesに頼らずに画像を取得することはもちろん可能である:

UIImage *snapshotImage = [self imageFromView:someView]; 

残念ながら、複雑なビューをキャプチャする場合、の速度に一致することはできません。drawViewHierarchyInRect私はsnapshotViewAfterScreenUpdatesによって作成されたビューからUIImageを取得する方が速いことを望んでいました、これは可能ですか?

答えて

20

答えは、暗黙のうちに、この確認NOとAppleのdocumentationのようだ:あなたはdrawViewHierarchyInRect:afterScreenUpdates:方法 代わりに使用し、スナップショットには、そのようなぼかしなどのグラフィカルな効果を、適用したい場合は

を。

それはがWWDC13からiOSのセッションで魅力的なUIを実装することは注目に値します最速の方法としてsnapshotViewAfterScreenUpdatesを示していますが、サンプルコードではdrawViewHierarchyInRectを使用しています。

+2

私は、これが機能していない理由は、スナップショットによって返されたビューが実際に完全なビューではないということです。デバッガをステップ実行すると、そのタイプが '_UIReplicantView'であることがわかります。これは、私がそれが他のビューの最適化されたコピーであり、 '完全な' UIViewの同じ 'レイヤー'特性を持っていないと思うようになります... – MobileVet

+1

ありがとう@MobileVet、それは知っておきたいことです。すばらしいスクリーンキャプチャのすべての機能であるピクセルからピクセルを取得する方法がないということにはまだ不満が残っています。 – carton

+1

Appleはこれが不可能であることを確認します。参照してください:http://www.raywenderlich.com/forums/viewtopic.php?f=37&t=8993&start=10 –

関連する問題