web-dev-qa-db-ja.com

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

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

The new sliding modal presentation in iOS 13

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

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

105
Jakub Truhlář

オプション1:

viewController.isModalInPresentation = true

Disabled interactive dismissal

(無効なインタラクティブ.pageSheet解任はこのように動作します。)

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

From official docstrueの場合、UIKitはビューコントローラの境界外のイベントを無視し、インタラクティブ画面上にあるときのビューコントローラーの終了。


オプション2:

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

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

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

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

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

    enter image description here

  2. インタラクティブな破棄を無効にして新しいプレゼンテーションスタイルを維持したい場合は、UIViewControllerプロパティisModalInPresentationtrueに設定します。

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

プロパティisModalInPresentationが役立つかもしれません。

ドキュメントから:

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

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

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

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

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

5
Brandon Whitton

アップルはそれについてサンプルコードを共有しました このリンクで

多くのユーザーが提案するようにisModalInPresentationを使用します。