我们正在使用UIHostingController
s 在我们的 UIKit 应用程序中嵌入 SwiftUI 视图。
由于ActionSheet
SwiftUI 中的警报在 iOS 13.4 以下 iPad 上仍会崩溃,因此我们改为UIAlertController([...], preferredStyle: .actionSheet)
使用托管视图控制器呈现 a。
在 iOS 13 中,一旦在 iPad 上显示弹出框警报,与弹出框下方的视图的所有交互都会被阻止。但是,在使用 iOS 14+ 设备进行测试时,我们注意到虽然弹出框正在呈现,但用户仍然可以与它们下方的视图进行完全交互。
这仅适用于 SwiftUI 视图。在我们有一些 UIKit 视图和嵌入式 SwiftUI 视图的视图控制器中,点击底层 UIKit 视图只会关闭弹出框,正如预期的那样。但是,SwiftUI 视图对交互的反应就像没有呈现任何内容一样。
我们现在通过自定义委托禁用交互:
class InteractionDisablingPopoverPresentationDelegate: NSObject, UIPopoverPresentationControllerDelegate {
private weak var viewController: UIViewController?
init(viewController: UIViewController?) {
self.viewController = viewController
}
func prepareForPopoverPresentation(_ popoverPresentationController: UIPopoverPresentationController) {
viewController?.view.isUserInteractionEnabled = false
}
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
viewController?.view.isUserInteractionEnabled = true
}
}
这当然使用起来有些危险。我们是否缺少一个可以恢复所需行为的选项,就像在 iOS 13 中一样?