前提
モーダルとかdismissとかって何? って方は下記をご覧ください。
【iOS】画面遷移方法まとめ
事象
iOS13から、モーダル画面のデフォルトが変更になり、下スワイプ操作で閉じられるようになりました。
何が困る?
困るケースとして考えられるのは、たとえば下記です。
- 戻ることを想定していない画面
- 戻り先をアプリ内で指定しているような画面
- 入力を完了させるまで戻らせない設計にしていた画面
- 書いてみたものの、どんなケースだ?
- 半強制で答えさせたいアンケート情報とか?
- 「重要事項を確認しましたか?」→「はい」「いいえ」を絶対に押させる、とか?
UI/UX的に考えると、絶対に戻れない画面ってそもそもよくないですが、
要件によってはそうしたいケースも出てくるかとは思います。
回避方法は2つ
回避方法は2つあります。
- modalPresentationStyleに.fullScreenを指定する
- .isModalInPresentationをtrueにして下スワイプ閉じを封じる
1. modalPresentationStyleに.fullScreenを指定する
遷移先のViewControllerの持っているmodalPresentationStyleというプロパティに、.fullScreenを指定することで、回避できます。
viewController.modalPresentationStyle = .fullScreen
(画像はこちらから引用)
ちなみにデフォルトが.automatic。
この指定だと、モーダル画面がiOS13以降でも、iOS12前みたいなUIにすることができます。
ただ下スワイプを封じる目的のために、インターフェイス変えちゃうのはどうなの? というのがあります。
また、2重にモーダル起動しているケース(たとえば会員情報入力画面から重要情報説明画面をモーダルで出すとか)だと、
最初にモーダル遷移した画面がiOS13仕様なので、その上でfullScreen指定しても、下スワイプで閉じる操作は封じられません。
その場合、選択肢2を選びましょう。
2. .isModalInPresentationをtrueにして下スワイプ閉じを封じる
isModalInPresentationをtrueにすると、封じられます。
if #available(iOS 13.0, *) {
viewController.isModalInPresentation = true
}
操作感としては、下スワイプでモーダル画面が下がりはするけども、
「ガッ」「ガッ」と引っかかって、閉じることはできない、みたいになります。
iOS13以降の操作にユーザーが慣れて、下スワイプでモーダル画面閉じられるのが当たり前という感覚になったら、
ストレスを感じる挙動になると思うので、全モーダルにこれを指定するよりかは、
閉じられたら問題が出る画面だけ使うのが賢明な気がしますね🐧🐧🐧