iOS 9での開発ネタです。iOS 9では、マルチタスキングという技術が入りました。マルチタスキングの機能の一つに、スプリット表示があります。
このスプリット表示で、アプリがプライマリアプリとして実行されているのか、セカンダリアプリとして実行されているのかによって、ユーザーインターフェイスを変更する必要があります。
標準アプリの動作は?
まずは、標準アプリの動作を確認してみます。確認に使ったのは、写真アプリ、メール、Safariです。
これら3つのアプリでは、プライマリアプリのときは、小さくなってもiPadアプリとしてGUIを使っています。領域が狭くなるので、その分だけボタンを移動したり、ビューを縮めるなどしています。オートレイアウトで設定しておけば良い範囲です。
セカンダリアプリのときは、iPhoneで表示されたときのGUIを使っています。現行のiPhoneよりも縦が長いiPhoneという感じでユーザーインターフェイスを構築しています。
セカンダリアプリであることを判定するには?
この記事の本題です。標準アプリと同様にセカンダリアプリのときは、iPhone用のGUIを表示するというように、セカンダリアプリのときと、プライマリアプリのときとで動作を変更するには、セカンダリアプリであることを識別する必要があります。
なお、サイズクラスを使って、Storyboardファイル内で、それぞれ用のユーザーインターフェイスを作ってしまえば、コードで行う必要はありません。しかし、コードレイアウト処理を行っている場合には、判定する必要があります。
判定方法
判定するための公式APIはありません。しかし、ヒントはあります。公式ドキュメントの「Adopting Multitasking Enhancements on iPad」の「Slide Over and Split View Quick Start」には、次のような記述があります。
Can occupy two-thirds of the screen in landscape orientation, obtaining a regular horizontal size class in Split View (the secondary app can occupy, at most, half of the screen in landscape Split View, remaining in a compact horizontal size class)
この記述と動作を元に判定方法を考えてみると、水平方向のサイズクラスがコンパクトで、ビューの幅が、デバイスを縦方向に持ったときのスクリーン幅の半分未満なら、セカンダリアプリでコンパクト表示が必要なときとして判定できます。
プライマリアプリのときは、最小でも、デバイスを縦方向に持ったときのスクリーン幅の半分以上はあります。
上記の考えを元に、コードを組み立ててみると、上手く動作しました。
セカンダリアプリで、最小表示のときはiPhoneと同じGUI、デバイスを横方向にして、中央で分割するようにしたときは、セカンダリアプリでもiPadのGUIという動作を実装出来ました。