0

我想导航到禁用系统边缘手势的自定义 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")
        }
    }
}
4

1 回答 1

1

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

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

由于您无权访问 SwiftUI 中的视图控制器(甚至不知道它将使用哪种类型的视图控制器),我选择只调整childForScreenEdgesDeferringSystemGestureschildForHomeIndicatorAutoHiddengetter 并返回通过循环遍历所有UIViewController.children.

由于您从我的 Gist 链接到这个问题,我将链接到那里以获取特定于我的 Gist 的解决方案。https://gist.github.com/Amzd/01e1f69ecbc4c82c8586dcd292b1d30d

于 2021-05-11T14:11:18.450 回答