Multitask Switcher
iOS7 から Multitask Switcher 画面(ホームボタンを二回連続して押すと iOS デバイス下部に表示される領域)にアプリのスナップショット画像が表示されるようになった。これは、アプリを切り替える際に非常に便利である。しかし、拙作の写真メモアプリ SnapNotes では、メモ代りに写真を使っているので、Multitask Switcher では見えないようにしたかった。(iPhone の画面が大きいので結構まる見え状態になるのよね。)
ドキュメントを眺めていたら、UIApplication の ignoreSnapshotOnNextApplicationLaunch が使えそうなので、ソースコードに組み込んでみた。しかし、何も変わらずアプリ画面がまる見えのスナップショットが表示された。アプリ起動後に呼び出すだけじゃダメなのか?
Multitask Switcher 画面に任意の画像を表示させる
調べたところ Multitask Switcher に表示されるスナップショットは、アプリの状態が Resign になった時の画面らしい。それならば、UIApplicationDelegate の applicationWillResignActive: 内で UIWindow の画像を変更すればよい。今回は、写真画像なので、画面一面を真っ黒にしないで、すりガラス越しの画像っぽくした。理由は、iOS8 から導入された UIVisualEffectView を使いたかったからである。あと、写真メモなので真っ黒画面は嫌だったので。
以下、AppDelegate.m に追加するコードである。
@property (nonatomic,strong) UIImageView * imageView;
#pragma mark - UIApplicationDelegate
-(void)applicationDidBecomeActive:(UIApplication *)application
{
if (self.imageView.superview) {
[self.imageView removeFromSuperview];
self.imageView = nil;
}
}
#pragma mark - UIApplicationDelegate
-(void)applicationWillResignActive:(UIApplication *)application
{
[self coverMainWindowForPrivacy]; // ここで Multitask Switcher 用の画像に差し替える
}
すりガラス越しの画像作成は、汎用的に利用できるように独立したメソッドにしてある。他のソースコードに簡単に取り込めるよ。
-(void)coverMainWindowForPrivacy
{
CGSize size = self.window.bounds.size;
BOOL opacity = YES;
CGFloat scale = 0.0f;
// 現在表示中のアプリの画像を UIImage に変換して、UIImageView を作成。
UIGraphicsBeginImageContextWithOptions(size, opacity, scale);
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView * imageView;
imageView = [[UIImageView alloc] initWithImage:image];
// すりガラス越しの効果を表現する View を作成。
UIVisualEffect * blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView * blurView;
blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
blurView.frame = imageView.bounds;
[imageView addSubview:blurView]; // UIImageView の画像にすりガラス効果
[self.window addSubview:imageView]; // 表示中のアプリの画面を差し替え
self.imageView = imageView; // BecomeActive 時で画像を取り除くので必須
}
UIVisualEffect の Style は他にもあるので、クラスリファレンスを読んでね。
上記ソースコードの coverMainWindowForPrivacy メソッド内の UIImage を好きな画像に置き換えれば、任意のスナップショットを Multitask Switcher の画面に表示できる。その場合は、上記ソースコード内のアプリ画面のキャプチャとすりガラス効果のコードは不要である。
たとえば、アプリ起動時にパスコードの入力が必須な場合は、そのパスコード入力の画像で置き換えれば良い。
ソースコードは次のような感じかな。
-(void)coverMainWindowWithPasscodeLockScreen
{
UIImage * image = [UIImage imageNamed:@"パスコード入力画面の画像"];
UIImageView * imageView;
imageView = [[UIImageView alloc] initWithImage:image];
[self.window addSubview:imageView];
self.imageView = imageView;
}
以上、Multitask Switcher に表示される画像を差し替える方法でした。