我正在为 iOS 13 的新“卡片式”模式视图更新我的应用程序。一切都运行良好,使用UIAdaptivePresentationControllerDelegate
’s presentationControllerDidAttemptToDismiss()
and presentationControllerDidDismiss()
功能。但是,对于有自己观点的人来说.modalPresentationStyle
set to .popover
, presentationControllerDidDismiss()
当在紧凑的环境中呈现时(例如分体或滑盖的手机或 iPad),不会调用。当在常规尺寸类环境(例如 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
or .formSheet
,那么无论是紧凑演示还是常规演示,一切都会按预期进行。
我尝试过使用代表的adaptivePresentationStyle()
将样式更改为.formSheet
在紧凑的环境中,但是presentationControllerDidDismiss()
仍然没有正确调用。
Update:
我应该提到我当前的解决方法是检查尺码类别并更改.modalPresentationStyle
如所须:
if self.traitCollection.horizontalSizeClass == .compact {
navController.modalPresentationStyle = .automatic
} else {
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
}
这可行,但似乎只使用.popover
样式应该正确适应并调用正确的委托方法。
更新2:我更新了上面的代码以澄清呈现视图控制器是处理委托方法的控制器。
另外,在深入研究之后,我注意到如果呈现视图控制器是委托并处理委托方法,然后这一切都按预期工作。由于它也适用于呈现所有人的视图控制器.modalPresentationStyle
's except在紧凑环境中的弹出窗口中,当弹出窗口以这种方式呈现时,也许存在一些生命周期问题?
关于我可能做错了什么有什么想法吗?