22
14

More than 3 years have passed since last update.

iOS13で追加されたモーダル画面が下スワイプ操作でdismissするのを無効にしたい

Posted at

前提

モーダルとかdismissとかって何? って方は下記をご覧ください。
【iOS】画面遷移方法まとめ

事象

iOS13から、モーダル画面のデフォルトが変更になり、下スワイプ操作で閉じられるようになりました。

何が困る?

困るケースとして考えられるのは、たとえば下記です。

  • 戻ることを想定していない画面
  • 戻り先をアプリ内で指定しているような画面
  • 入力を完了させるまで戻らせない設計にしていた画面
    • 書いてみたものの、どんなケースだ?
    • 半強制で答えさせたいアンケート情報とか?
    • 「重要事項を確認しましたか?」→「はい」「いいえ」を絶対に押させる、とか?

UI/UX的に考えると、絶対に戻れない画面ってそもそもよくないですが、
要件によってはそうしたいケースも出てくるかとは思います。

回避方法は2つ

回避方法は2つあります。

  1. modalPresentationStyleに.fullScreenを指定する
  2. .isModalInPresentationをtrueにして下スワイプ閉じを封じる

1. modalPresentationStyleに.fullScreenを指定する

遷移先のViewControllerの持っているmodalPresentationStyleというプロパティに、.fullScreenを指定することで、回避できます。

viewController.modalPresentationStyle = .fullScreen

Storyboard使っているなら、ここを変えてください。
image.png

(画像はこちらから引用)

ちなみにデフォルトが.automatic。
この指定だと、モーダル画面がiOS13以降でも、iOS12前みたいなUIにすることができます。
ただ下スワイプを封じる目的のために、インターフェイス変えちゃうのはどうなの? というのがあります。
また、2重にモーダル起動しているケース(たとえば会員情報入力画面から重要情報説明画面をモーダルで出すとか)だと、
最初にモーダル遷移した画面がiOS13仕様なので、その上でfullScreen指定しても、下スワイプで閉じる操作は封じられません。
その場合、選択肢2を選びましょう。

2. .isModalInPresentationをtrueにして下スワイプ閉じを封じる

isModalInPresentationをtrueにすると、封じられます。

if #available(iOS 13.0, *) {
    viewController.isModalInPresentation = true
}

操作感としては、下スワイプでモーダル画面が下がりはするけども、
「ガッ」「ガッ」と引っかかって、閉じることはできない、みたいになります。
iOS13以降の操作にユーザーが慣れて、下スワイプでモーダル画面閉じられるのが当たり前という感覚になったら、
ストレスを感じる挙動になると思うので、全モーダルにこれを指定するよりかは、
閉じられたら問題が出る画面だけ使うのが賢明な気がしますね🐧🐧🐧

参考

iOS13でのモーダル表示
iOS 13 以降でモーダルを fullScreen 表示させる3つの方法

22
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
14