IOS 13の新しい「カードスタイル」モーダルビュー用にアプリを更新しています。 UIAdaptivePresentationControllerDelegate
のpresentationControllerDidAttemptToDismiss()
関数とpresentationControllerDidDismiss()
関数を使用すると、すべてがうまく機能しています。ただし、_.modalPresentationStyle
_が_.popover
_に設定されているビューの場合、コンパクトな環境(電話またはiPadがスプリットまたはスライドオーバーになっているなど)で表示される場合、presentationControllerDidDismiss()
は呼び出されません。 。通常のサイズのクラス環境(iPadのフルスクリーンなど)で表示されると、正しく呼び出されます。
これを設定する私のコードはかなり簡単です:
ポップオーバーを表すコード:
_func showChooser() {
// other setup code...
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
self.present(navController, animated: true)
}
_
次に、提示されたコントローラーはUIAdaptivePresentationControllerDelegate
に準拠してセットアップします。
_// This is in the presented view controller (i.e. the popover)
override func viewDidLoad() {
// other setup removed for brevity…
self.navigationController?.presentationController?.delegate = self
}
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
print("did dismiss")
self.cancel?()
}
_
通常のサイズクラス環境でビューが表示されると、ポップオーバーとして正しく表示されます。ユーザーがポップオーバーの外側をタップすると、presentationControllerDidDismiss()
が呼び出されます。ただし、同じコードがコンパクトな環境で表示されると、それは(カードスタイルとして)正しく表示されますが、ユーザーがビューを下にドラッグすると、presentationControllerDidDismiss()
は呼び出されません。
_.modalPresentationStyle
_を_.pageSheet
_や_.formSheet
_などの他のものに変更すると、コンパクトプレゼンテーションまたは通常のプレゼンテーションのいずれでも期待どおりに機能します。
デリゲートのadaptivePresentationStyle()
を使用してコンパクト環境でスタイルを_.formSheet
_に変更しようとしましたが、presentationControllerDidDismiss()
はまだ正しく呼び出されていません。
pdate:現在の回避策はサイズクラスを確認し、必要に応じて_.modalPresentationStyle
_を変更することです。
_if self.traitCollection.horizontalSizeClass == .compact {
navController.modalPresentationStyle = .automatic
} else {
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
}
_
これは機能しますが、_.popover
_スタイルを使用するだけで適切に適応し、適切なデリゲートメソッドを呼び出すようです。
pdate 2:上記のコードを更新して、presentedビューコントローラがデリゲートメソッドを処理するコントローラであることを明確にしました。
また、これをさらに掘り下げた後、presentingビューコントローラがデリゲートであり、デリゲートメソッドを処理する場合、これはすべて期待どおりに機能することに気付きました。コンパクトな環境ですべての_.modalPresentationStyle
_のexceptポップオーバーのpresentedビューコントローラーでも機能するため、おそらくいくつかのポップオーバーがそのように提示されるときの生涯の問題?
私が間違っている可能性があることについて何か考えはありますか?
self.present(navController, animated: true)
の後にnavController.presentationController?.delegate = // * navController.viewControllers[0]
を入れます。そうしないと、presentationController
がnilになる可能性があります
その例のヒープに感謝します-マットの詳細を拡張し、一般的な例(スタンドアロンのviewControllerの作成)を探している人のために、以下のようなものも機能するはずだと思います:
func presentExampleViewController() {
// Any other setup code specific to the view in your app can go here...
let exampleViewController = SomeCustomViewController()
exampleViewController.presentationController?.delegate = exampleViewController
self.present(exampleViewController, animated: true)
}