web-dev-qa-db-ja.com

snapshotViewAfterScreenUpdatesで作成されたUIViewからのUIImage:

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

snapshotViewAfterScreenUpdatesから返されたUIViewは、サブビューとして追加すると正常に見えますが、次のように黒い画像が生成されます。

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];

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

25
carton

答えは[〜#〜] no [〜#〜]のようであり、Appleの documentation はこれを暗黙的に確認します。

スナップショットにぼかしなどのグラフィック効果を適用する場合は、drawViewHierarchyInRect:afterScreenUpdates:メソッドの代わりに。

WWDC13からのImplementing Engaging UI on iOSセッションはsnapshotViewAfterScreenUpdatesを最速のメソッドとしてリストしていますが、サンプルコードではdrawViewHierarchyInRectを使用しています。

20
carton