UIPresentationControllerを知る
本記事では、UIPresentationControllerとその実装について解説します。
トランジションのカスタマイズ方法
1. 遷移先のVIewControllerのサイズをカスタマイズする / 遷移時のアニメーションを簡易的にカスタマイズする→ 本記事
2. 遷移時のアニメーションをカスタマイズする → こちら
3. 遷移をインタラクティブにする → こちら
UIPresentationController
UIPresentationControllerは、遷移のアニメータとViewControllerの表示を管理するオブジェクトです。アラートやハーフモーダルなどのようなUIを実装することができます 。
表示プロセス
UIPresentationControllerによるViewControllerの表示プロセスは次の3つのフェーズに分けられます。
- 表示:遷移アニメーションを通して新しいViewControllerに画面上に移動させる
- 管理:新しいViewControllerが表示されている間、環境の変化(デバイスの回転など)に対応する
- 破棄:遷移アニメーションを通して新しいViewControllerを画面外に移動させる
overrideすべきメソッド
カスタムのUIPresentationControllerを実装する際、以下のメソッドのoverrideを検討します。
presentationTransitionWillBegin()
,dismissalTransitionWillBegin()
遷移アニメーションのためのカスタムビューをview hierarchyに追加します。presentationTransitionDidEnd(_:)
新しいViewControllerへの遷移が完了しなかった場合、このメソッド内でview hierarchyからカスタムビューを取り除きます。dismissalTransitionDidEnd(_:)
新しいViewControllerのdismissが完了した場合、このメソッド内でview hierarchyからカスタムビューを取り除きます。
遷移アニメーションの際に用いるカスタムビューは、大抵表示時と破棄時で同じものを利用するため、ViewControllerが表示されている間はview hierarchyに追加したままにしておきます。
size(forChildContentContainer:withParentContainerSize:)
新しいViewControllerのサイズを返します。frameOfPresentedViewInContainerView
新しいViewControllerのCGRectを返します。sizeには上述のsize(forChildContentContainer:withParentContainerSize:)
の返り値を利用します。containerViewWillLayoutSubviews()
レイアウト関連の変更を行います。通常はpresentedView.frame
にframeOfPresentedViewInContainerView
を指定やカスタムビューのサイズ更新などを行います。
新しいViewControllerのsizeやframeは別々のメソッド/プロパティで指定する必要があります。やや助長に感じますが、それぞれ別の箇所からも利用されるため、新しいViewControllerのサイズを変更する場合には両方のoverrideが必須になります。
また、frameOfPresentedViewInContainerView
プロパティは遷移アニメーションが行われる際に参照される値なので、viewの再計算が必要な場合(デバイスの回転時など)には新しいViewControllerに渡されません。したがって、containerViewWillLayoutSubviews()
内でpresentedView
に割り当てる必要があります。
カスタムUIPresentationControllerの割り当て
実装したUIPresentationControllerは、遷移先のViewControllerに割り当てます。まず、遷移先にUIViewControllerTransitioningDelegate
を割り当て、デリゲートのpresentationController(forPresented:presenting:source:)
メソッドにて実装したカスタムのUIPresentationControllerを返します。
サンプル
以下は、新しいViewControllerを縦横それぞれ半分の大きさで中央に表示するカスタムUIPresentationControllerです。
このカスタムUIPresentationControllerによって、新しいViewControllerはデフォルトの下から出てくるアニメーションで表示されますが、その後ろにある半透明のカスタムビューはフェードインアニメーションで表示されます。UIViewControllerAnimatedTransitioning
に対応したアニメータを実装すれば、カスタムビューだけでなく新しいViewControllerの遷移アニメーションも変更することができます 。