Viewのスナップショットを丸々画像として(もしくは新しいViewとして)取得したい時がある。
今回はこの やり方に挑戦する。

まず以下のようにViewの設定をしておく。
スナップショット_ss1
グレーの部分がスナップショットを取得したい対象のViewだ。
その下のボタンを押すことでスナップショットを取得する。

早速ソースを見ていこう。
@property (weak, nonatomic) IBOutlet UIView *targetView;

- (IBAction)toView:(id)sender;
- (IBAction)toImage:(id)sender;
対象のViewと操作のためのボタンを準備する。
これらはStoryboardで紐付けておく。

最初に画像として取得する法を見ていこう。
- (IBAction)toImage:(id)sender {
    // 1
    UIGraphicsBeginImageContextWithOptions(_targetView.bounds.size, NO, 0);
    [_targetView drawViewHierarchyInRect:_targetView.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    // 2
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    CGRect frame = CGRectMake(10, 240, 300, 120);
    imageView.frame = frame;
    [self.view addSubview:imageView];
}
1.ViewをUIImageとして取得する。

2.取得した画像をUIImageViewとして追加する。

特に問題はない簡単な処理だ。
それでは次にUIViewとして取得する方法を見てみよう。
- (IBAction)toView:(id)sender {
    UIView *view = [_targetView snapshotViewAfterScreenUpdates:YES];
    CGRect frame = CGRectMake(10, 380, 300, 120);
    view.frame = frame;
    [self.view addSubview:view];
}
画像として取得する場合よりもさらにシンプルでわかりやすくなった。

これらの実行結果はこのようになる。
スナップショット_ss2
この2つの方法はどちらが優れているかという類の話ではない。
用途の問題だ。
今回のサンプルのように「最終的にViewとして使う」のであれば、後者が便利だろう。

参考文献
James Tang : Fast snapshot any views on iOS 7