仅在某些视图控制器中延迟系统边缘手势。斯威夫特用户界面

Defer system edge gestures in only some view controllers. SwiftUI

我想导航到禁用系统边缘手势的自定义 UIView。我将 SwiftUI 生命周期与 UIViewControllerRepresentable 一起使用并覆盖 preferredScreenEdgesDeferringSystemGestures。

我已经看到了 SceneDelegates 的解决方案。 preferredScreenEdgesDeferringSystemGestures 是否必须作用于 window.rootViewController 才能工作?

class MyUIViewController: UIViewController {
    typealias UIViewControllerType = MyUIViewController
    open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
        return [.all];
    }
    let labelDescription: UILabel = {
        let label = UILabel()
        label.text = "But it's not working."
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(labelDescription)
        labelDescription.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
        setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
    }
}
struct UIViewControllerRepresentation : UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> some UIViewController {
        let uiViewController = MyUIViewController()
        return uiViewController
    }
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
}
struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("To UIView with no system edge gestures.",
                           destination: UIViewControllerRepresentation())
                .navigationTitle("Title")
        }
    }
}

https://developer.apple.com/documentation/uikit/uiviewcontroller/2887511-childforscreenedgesdeferringsyst

如果我理解正确,系统只会询问第一个 UIViewController,如果 vc 没有 return 系统也应该询问的 child 那么就是这样。

由于您无权访问 SwiftUI 中的视图控制器(甚至不知道它将使用什么类型的视图控制器),我选择只混合 childForScreenEdgesDeferringSystemGestureschildForHomeIndicatorAutoHidden getter 和return 通过遍历所有 UIViewController.children.

为我管理这些的视图控制器

既然你 link 从我的 Gist 那里回答了这个问题,我将 link 回到那里寻找特定于我的 Gist 的解决方案。 https://gist.github.com/Amzd/01e1f69ecbc4c82c8586dcd292b1d30d