[iOS13 Beta]Modalityの挙動変更について

どう変わる?

iOS 13からFullscreenだったModalityの挙動が変わります。

以前までは基本的に全画面表示で表示されていたModalityが下の画面が少し見える表示になっています。(勝手にSemiModalityとします)

SemiModal表示
SemiModal表示

下方向にスワイプすると、上に表示されている画面を終了して前の画面に戻ることが可能になりました。

これでは、今まで戻るボタンを設置せずにユーザーにアクションを望んでいた動作は保証されなくなります。

ライフサイクル挙動の確認

全てのModalityがそうなるかというと、そうではありません。

ボタンを押下し、Modalityを表示。その後Modalviewを閉じた際に呼ばれるライフサイクルのメソッド順を調査

A: 遷移元のViewController

B: Modalで表示するViewController

UIPopoverPresentationController使っていれば変わりません

UIModalPresentationStyle iOS12iOS13
fullScreen A viewWillDisappear
B viewWillAppear
B viewDidAppear
A viewDidDisappear
B viewWillDisappear
A viewWillAppear
A viewDidAppear
B viewDidDisappear
同じ
pageSheetA viewWillDisappear
B viewWillAppear
B viewDidAppear
A viewDidDisappear
B viewWillDisappear
A viewWillAppear
A viewDidAppear
B viewDidDisappear
B viewWillAppear
B viewDidAppear
B viewWillDisappear
B viewDidDisappear
formSheetA 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
同じ
customB 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の遷移でPresentationAutomaticにしているとSemiModalになります。

default設定はpageSheetになります。

PresentationをFullScreenにしておけば全画面で表示されます

どう解決したらいいか?

以前と同じような表示にしたい場合にはUIModalPresentationStyleにfullScreenoverFullScreenを設定し、全画面表示してあげれば以前と同じになります

補足

UIPopoverPresentationControllerを使用している場合にはライフサイクルに変更はみられませんでした

まとめ

  • pageSheetやfromSheetやpopoverで表示していた場合、以前はフルスクリーンで表示されていた画面がSemiModality表示に変わります。
  • SemiModalityになるとスワイプで閉じることが可能になるので、アクションを必須にしていた場合に意図とは違う結果になる可能性があるのでfullScreenで表示するなどの対応が必要です
  • popoverなどを使ってModalityを表示している場合はライフサイクルに変更が生じている場合があるので注意
タイトルとURLをコピーしました