【iOS8】iPhoneでViewControllerをPopover表示

(これは2014年末にiOS8.0〜8.1に向けて書いたテキストです。また内容の正確性は保証しません)

これまでのUIPopverControllerはiPad専用でiPhoneでは使用できず、iPhoneでPopover的なことをやるには自前でそれらしいものを作る以外になかった。またUIPopoverControllerはiPhoneでは使えないので、ユニバーサルアプリでこれを使おうと思うと分けて処理する必要があり面倒だった。

iOS8からは、ViewControllerのmodalPresentationStyleに .Popover が追加され、これを指定して presentViewController するとポップオーバーとして表示されるようになった。
これを使うと、iPadではポップオーバーで、iPhoneだとモーダルな全画面で表示され、iPhoneとiPadで処理を分ける必要が無くなった。

めでたしめでたし。

じゃない。iPhoneでポップオーバーで表示したい。

できる。でもちょっとトリッキー。

まず最初に、UIPopoverControllerを使わずに、presentViewController:でポップオーバーを表示させるのはこんなカンジ。

ポイント:

  • .modalPresentationStyleを .Popoverにする
  • .preferredContentSizeを指定する。指定しないと予期しない大きさのポップオーバーが出てきてビックリする。
  • .popoverPresentationController でポップオーバーの出現する場所と矢印の向きなどの設定を行う

これで、iPadだとポップオーバーで、iPhoneだとモーダルで表示されるようになる。これまでモーダルな表示に使っていた presentViewControllerメソッドを使うし、iPhoneとiPadで処理を分ける必要がないし、だいぶいいカンジ。

んで、iPhoneでもポップオーバーさせるために、さらにちょちっと追加する。

ポイント:

  • presentationControllerのdelegateをセットする
  • デリゲートの adaptivePresentationStyleForPresentationController: メソッドを追加して、 .None を返す

これで iPhoneでもポップオーバー表示されるようになります。
スクリーンショット 2014-12-13 10.01.47

このiPhoneでもPopover表示を可能にする方法はWWDC2014のビデオ
View Controller Advancement in iOS 8
で紹介されているのだが、リファレンスなど探してもどこにもテキストでの記述が見当たらない。

iOS8の新機能ってWWDCビデオで紹介されてるけどアンドキュメントとか、ちょっと細かく弄ろうと思うとアンドキュメントでサンプルコード漁るしかないとかそんなん多いよ。。。