SwiftUI 中的 PreferredScreenEdgesDeferringSystemGestures

Asp*_*pid 3 homescreen swipe ios swiftui

其中UIKit有一个选项可以禁用“Home”系统从底部向上滑动(不是完全禁用,但滑动会忽略第一次,并且如果用户确实想要的话,将强制用户重复它)。setNeedsUpdateOfScreenEdgesDeferringSystemGestures()实际上做对了我所需要的。

但如何在 SwiftUI 中达到同样的效果呢?

我尝试在 SceneDelegate 中调用此方法,如下所示:

        let window = UIWindow(windowScene: windowScene)
        let uiKitView = UIHostingController(rootView: contentView)
        uiKitView.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
        window.rootViewController = uiKitView
Run Code Online (Sandbox Code Playgroud)

preferredScreenEdgesDeferringSystemGestures但如果您不重写返回,它就不起作用.all 我无法重写以下计算属性UIHostingController

extension UIHostingController {
    open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
        return [.all];
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到警告:

泛型类的扩展不能包含“@objc”成员

有人知道如何实现这一目标吗?

Asp*_*eri 5

更新 Xcode 14 / iOS 16

现在 SwiftUI 通过修饰符自然地支持它defersSystemGestures

  body: some View {
    MainView()
      .defersSystemGestures(on: .bottom)   // << here !!
  }
Run Code Online (Sandbox Code Playgroud)

原来的

只需在自定义托管控制器中覆盖它即可

class MyHostingController<Content: View>: UIHostingController<Content> {
    open override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
        return [.all];
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其用作根控制器

let window = UIWindow(windowScene: windowScene)

let controller = MyHostingController(rootView: contentView)
controller.setNeedsUpdateOfScreenEdgesDeferringSystemGestures()

window.rootViewController = controller
Run Code Online (Sandbox Code Playgroud)