目次
iOS13になってModalityはどう変わる?
iOS 13からFullscreenだったModalityの挙動が変わります。
以前までは基本的に全画面表示で表示されていたModalityが下の画面が少し見える表示になっています。(勝手にSemiModalityとします)

下方向にスワイプすると、上に表示されている画面を終了して前の画面に戻ることが可能になりました。
これでは、今まで戻るボタンを設置せずにユーザーにアクションを望んでいた動作は保証されなくなります。
iOS13でのMOライフサイクル挙動の確認
全てのModalityがそうなるかというと、そうではありません。
ボタンを押下し、Modalityを表示。その後Modalviewを閉じた際に呼ばれるライフサイクルのメソッド順を調査
A: 遷移元のViewController
B: Modalで表示するViewController
※UIPopoverPresentationController使っていれば変わりません
UIModalPresentationStyle | iOS12 | iOS13 |
fullScreen | A viewWillDisappear B viewWillAppear B viewDidAppear A viewDidDisappear B viewWillDisappear A viewWillAppear A viewDidAppear B viewDidDisappear | 同じ |
pageSheet | A viewWillDisappear B viewWillAppear B viewDidAppear A viewDidDisappear B viewWillDisappear A viewWillAppear A viewDidAppear B viewDidDisappear | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappear |
formSheet | A viewWillDisappear B viewWillAppear B viewDidAppear A viewDidDisappear B viewWillDisappear A viewWillAppear A viewDidAppear B viewDidDisappear | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappear |
currentContext | A viewWillDisappear B viewWillAppear B viewDidAppear A viewDidDisappear B viewWillDisappear A viewWillAppear A viewDidAppear B viewDidDisappear | 同じ |
custom | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappea | 同じ |
overFullScreen | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappear | 同じ |
overCurrentContext | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappear | 同じ |
popover | A viewWillDisappear B viewWillAppear B viewDidAppear A viewDidDisappear B viewWillDisappear A viewWillAppear A viewDidAppear B viewDidDisappear | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappear |
automatic(iOS13から) | 無し | B viewWillAppear B viewDidAppear B viewWillDisappear B viewDidDisappear |
Segueの遷移でPresentationをAutomaticにしているとSemiModalになります。
default設定はpageSheetになります。
PresentationをFullScreenにしておけば全画面で表示されます
どう解決したらいいか?
以前と同じような表示にしたい場合にはUIModalPresentationStyleにfullScreenやoverFullScreenを設定し、全画面表示してあげれば以前と同じになります
補足
UIPopoverPresentationControllerを使用している場合にはライフサイクルに変更はみられませんでした
まとめ
- pageSheetやfromSheetやpopoverで表示していた場合、以前はフルスクリーンで表示されていた画面がSemiModality表示に変わります。
- SemiModalityになるとスワイプで閉じることが可能になるので、アクションを必須にしていた場合に意図とは違う結果になる可能性があるのでfullScreenで表示するなどの対応が必要です
- popoverなどを使ってModalityを表示している場合はライフサイクルに変更が生じている場合があるので注意