仅在某些视图控制器中延迟系统边缘手势。斯威夫特用户界面
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")
}
}
}
如果我理解正确,系统只会询问第一个 UIViewController,如果 vc 没有 return 系统也应该询问的 child 那么就是这样。
由于您无权访问 SwiftUI 中的视图控制器(甚至不知道它将使用什么类型的视图控制器),我选择只混合 childForScreenEdgesDeferringSystemGestures
和 childForHomeIndicatorAutoHidden
getter 和return 通过遍历所有 UIViewController.children
.
为我管理这些的视图控制器
既然你 link 从我的 Gist 那里回答了这个问题,我将 link 回到那里寻找特定于我的 Gist 的解决方案。 https://gist.github.com/Amzd/01e1f69ecbc4c82c8586dcd292b1d30d
我想导航到禁用系统边缘手势的自定义 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")
}
}
}
如果我理解正确,系统只会询问第一个 UIViewController,如果 vc 没有 return 系统也应该询问的 child 那么就是这样。
由于您无权访问 SwiftUI 中的视图控制器(甚至不知道它将使用什么类型的视图控制器),我选择只混合 childForScreenEdgesDeferringSystemGestures
和 childForHomeIndicatorAutoHidden
getter 和return 通过遍历所有 UIViewController.children
.
既然你 link 从我的 Gist 那里回答了这个问题,我将 link 回到那里寻找特定于我的 Gist 的解决方案。 https://gist.github.com/Amzd/01e1f69ecbc4c82c8586dcd292b1d30d