iOS 13で提示されたView Controllerのインタラクティブな終了を無効にする


135

iOS 13では、モーダルで表示されるビューコントローラーの新しいデザインmodalPresentationStyle .pageSheet(およびその兄弟.formSheet)が導入されています…

iOS 13の新しいスライディングモーダルプレゼンテーション

…また、表示されたビューコントローラを下にスライドすることで、これらのシートを閉じることができます(インタラクティブな閉じます)。新しい「pull-to-dismiss」機能はかなり便利ですが、常に望ましいとは限りません。

質問:インタラクティブな解雇をオフにするにはどうすればよいですか? -プレゼンテーションスタイルは同じに保つことに注意してください。



6
@MehulThakkarそれは別の質問です。
JakubTruhlář19年

回答:


240

オプション1:

viewController.isModalInPresentation = true

インタラクティブな解雇を無効化

(無効にされたインタラクティブな.pageSheet解雇はこのように機能します。)

  • iOS 13以降には、UIViewControllerと呼ばれる新しいプロパティが含まれています。isModalInPresentationこのプロパティはtrue、インタラクティブな終了を防ぐために設定する必要があります。
  • 基本的には、ビューコントローラーの境界外のイベントを無視します。自動スタイルだけでなく、プレゼンテーションスタイル.popoverなども使用している場合は、そのことを覚えておいてください。
  • このプロパティはfalseデフォルトです。

公式ドキュメント:もしtrue、UIKitはビューコントローラの境界外のイベントを無視し、それが画面上にいる間にビューコントローラのインタラクティブな解雇を防ぐことができます。


オプション2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • iOS 13以降、UIAdaptivePresentationControllerDelegateという新しいメソッドが含まれていpresentationControllerShouldDismissます。
  • このメソッドは、提示されたビューコントローラーがプログラムによって閉じられておらず、そのisModalInPresentationプロパティがに設定されてfalseいる場合にのみ呼び出されます。

ヒント: presentationControllerのデリゲートを割り当てることを忘れないでください。


2
表示されたビューコントローラーがナビゲーションコントローラーの場合はisModalInPresentation、ナビゲーションコントローラーまたはナビゲーションスタックに表示される個々のビューコントローラーで設定できます。後者を使用すると、インタラクティブな却下が可能かどうかを画面ごとに選択できます。検索コントローラーに注意すると、個々のビューコントローラーより優先されます(ただし、ナビゲーションコントローラーは優先されません)。私のブログの記事で詳細情報:medium.com/@hacknicity/...
ジェフHackworth

1
VCがポップオーバーとして表示されている場合は、VCの外側をタップしたときにポップオーバーが
閉じ

4
Objective-C:viewController.modalInPresentation = YES;
quarac

3
にこのフラグを設定すると、誰かがこれを機能させましたUIImagePickerControllerか?私たちにとっては、UIImagePickerControllerそれを無視しているように見えるので、スワイプジェスチャーで閉じることができます。多分それはiOS 13のバグです。
PatrickDotStar

4
ときにpresentationControllerShouldDismiss(_ presentationController: UIPresentationController)返すfalseのは、presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)ユーザーがデータを入力した場合は確認ダイアログを追加するようなことを行うことができるように呼ばれています。
ニール

66
  1. 全画面でのモデルプレゼンテーションのように、以前のiOSバージョン(<iOS13)と同じ動作が必要な場合は、宛先ビューコントローラのプレゼンテーションスタイルを次のように設定するだけです。 UIModalPresentationStyle.fullScreen

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen

    ストーリーボードを使用している場合は、セグアを選択Full Screenし、Presentationドロップダウンからフォームを選択します。

    ここに画像の説明を入力してください

  2. インタラクティブな終了を無効にして、新しいプレゼンテーションスタイルセットUIViewControllerプロパティisModalInPresentationをに維持したい場合true

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }

{controller.isModalInPresentation = true}を使用するよりもうまく機能します。
Maxim Firsoff

8

プロパティisModalInPresentationが役立つ場合があります。

ドキュメントから:

これをに設定するとtrue、UIKitはビューコントローラーの境界外のイベントを無視し、画面上にある間はビューコントローラーがインタラクティブに閉じられるのを防ぎます。

次のように使用できます。

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)

5

ストーリーボードを使用してUIをレイアウトしている場合、ナビゲーションコントローラーを使用しているときにこのインタラクティブな終了を無効にする最善の方法は、属性インスペクターのナビゲーションコントローラーの表示を自動から全画面に変更することです。ナビゲーションスタック内のすべてのビューコントローラーは全画面表示になり、ユーザーが閉じることができなくなります。

ナビゲーションコントローラーの表示オプションを示す属性インスペクター


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.