iOS 13は、モーダル表示ビューにmodalPresentationStyle
.pageSheet
(およびその兄弟.formSheet
)の新しいデザインを導入しますコントローラ…
…そして、表示されたビューコントローラーを下にスライドすることで、これらのシートを閉じることができます(インタラクティブな閉じる)。新しい「pull-to-dismiss」機能はかなり便利ですが、常に望ましいとは限りません。
質問:インタラクティブな解任をオフにするにはどうすればよいですか? -プレゼンテーションスタイルは同じに保つことに注意してください。
viewController.isModalInPresentation = true
(無効なインタラクティブ.pageSheet
解任はこのように動作します。)
UIViewController
にはisModalInPresentation
という新しいプロパティが含まれています。これは、インタラクティブな終了を防ぐためにtrue
に設定する必要があります。.popover
などのプレゼンテーションスタイルも使用している場合は、そのことを覚えておいてください。false
です。From official docs:
true
の場合、UIKitはビューコントローラの境界外のイベントを無視し、インタラクティブ画面上にあるときのビューコントローラーの終了。
func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
return false
}
UIAdaptivePresentationControllerDelegate
にはpresentationControllerShouldDismiss
という新しいメソッドが含まれています。isModalInPresentation
プロパティがfalse
に設定されている場合にのみ呼び出されます。ヒント:presentationControllerのデリゲートを割り当てることを忘れないでください。
全画面でのモデルプレゼンテーションのように、以前のiOSバージョン(<iOS13)と同じ動作が必要な場合は、宛先ビューコントローラのプレゼンテーションスタイルをUIModalPresentationStyle.fullScreen
に設定するだけです。
let someViewController = \*VIEW CONTROLLER*\
someViewController.modalPresentationStyle = .fullScreen
ストーリーボードを使用している場合は、セグアを選択し、Presentation
ドロップダウンからFull Screen
を選択します。
インタラクティブな破棄を無効にして新しいプレゼンテーションスタイルを維持したい場合は、UIViewController
プロパティisModalInPresentation
をtrue
に設定します。
if #available(iOS 13.0, *) {
someViewController.isModalInPresentation = true // available in IOS13
}
プロパティisModalInPresentation
が役立つかもしれません。
ドキュメントから:
true
に設定すると、UIKitはビューコントローラーの境界外のイベントを無視し、画面に表示されている間、ビューコントローラーがインタラクティブに閉じられるのを防ぎます。
次のように使用できます。
let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
ストーリーボードを使用してUIをレイアウトしている場合、ナビゲーションコントローラーを使用しているときにこのインタラクティブな非表示を無効にする最善の方法は、属性インスペクターのナビゲーションコントローラーの表示を自動から全画面に変更することです。ナビゲーションスタックのすべてのビューコントローラーは全画面表示になり、ユーザーが閉じることができなくなります。
アップルはそれについてサンプルコードを共有しました このリンクで
多くのユーザーが提案するようにisModalInPresentation
を使用します。