UIPresentationControllerを知る

Satsuki Hashiba
6 min readMar 17, 2020

--

本記事では、UIPresentationControllerとその実装について解説します。

トランジションのカスタマイズ方法

1. 遷移先のVIewControllerのサイズをカスタマイズする / 遷移時のアニメーションを簡易的にカスタマイズする→ 本記事
2. 遷移時のアニメーションをカスタマイズする → こちら
3. 遷移をインタラクティブにする → こちら

UIPresentationController

UIPresentationControllerは、遷移のアニメータとViewControllerの表示を管理するオブジェクトです。アラートやハーフモーダルなどのようなUIを実装することができます 。

表示プロセス

UIPresentationControllerによるViewControllerの表示プロセスは次の3つのフェーズに分けられます。

  1. 表示:遷移アニメーションを通して新しいViewControllerに画面上に移動させる
  2. 管理:新しいViewControllerが表示されている間、環境の変化(デバイスの回転など)に対応する
  3. 破棄:遷移アニメーションを通して新しい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.frameframeOfPresentedViewInContainerViewを指定やカスタムビューのサイズ更新などを行います。

新しい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の遷移アニメーションも変更することができます 。

--

--

Satsuki Hashiba
Satsuki Hashiba

Written by Satsuki Hashiba

iOS Engineer 🍋 Master’s Student 🌄 Japan ⛩

No responses yet