0

我们正在使用UIHostingControllers 在我们的 UIKit 应用程序中嵌入 SwiftUI 视图。

由于ActionSheetSwiftUI 中的警报在 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 中一样?

4

0 回答 0