イッツァハローワールド

恥さらしていこうかなとか。

画面キャプチャをUIImageとして取得する方法

冬休みの宿題ということで、アプリを作っていました。

しかし、まだ世に出てきていません(リジェクト2回されている...
今、3回目の申請をしているところです。

初めてゲームを晒します。。作ったのは学校の課題以来...
癖になるクソゲーをコンセプトに作ったのですが、アプリについては世に出てから記事にしようかと。
また何回かリジェクトされそうな予感がするなあ。


というわけで、新しいことをだいぶやってきたので備忘録を起こします。
今回はアプリ内で画面キャプチャをUIImageとして取得する方法です。

ソース

+ (UIImage *)screenCapture:(UIView *)view {

    UIImage *capture;
	
    // ビットマップベースでグラフィックコンテキストを作成
    // 引数は左から、イメージのサイズ, 透過設定(NOで透過あり), 解像度のスケール(0でデバイス固有)
    UIGraphicsBeginImageContextWithOptions(view.frame.size , NO , 0.0 );
    
    // iOS7以降
    if ([view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
    	// コンテキストにスナップショットをレンダリングする
        [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    } else {
    	// ビューのLayerをコンテキストにレンダリングする
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    }
    
    // コンテキストをUIImageにする
    capture = UIGraphicsGetImageFromCurrentImageContext();
    // コンテキスト破棄
    UIGraphicsEndImageContext();
    
    return capture;
}


作成したアプリでは、SNSに投稿する際にさくっと結果画面をキャプって貼り付けたりしています。
上記はViewの中身をキャプっているので、いらないボタンとかのコントロールはキャプる直前にhiddenにし、イメージ取得後に戻しておくことで無駄なものまでキャプらないようにしました。