SwiftUI隐藏返回按钮保留右滑手势方案

发布于:2025-06-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

SwiftUI 隐藏返回按钮但保留右滑返回手势的方案

在 SwiftUI 中,如果你使用:

.navigationBarBackButtonHidden(true)

可以隐藏系统返回按钮,但会发现 右滑返回手势(边缘返回)失效了

这是因为 SwiftUI 底层使用了 UINavigationController,隐藏返回按钮后,系统默认禁用了手势。


✅ 目标

  • 隐藏系统返回按钮
  • 保留 iOS 原生右滑返回手势
  • 支持自定义返回按钮

🛠 解决方案

通过扩展 UINavigationController 恢复手势代理:

Swift 5.9+(使用 @retroactive

extension UINavigationController: @retroactive UIGestureRecognizerDelegate {
    open override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

Swift 5.8 及以下

extension UINavigationController: UIGestureRecognizerDelegate {
    open override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

⚠️ 注意事项

使用方式 是否影响右滑返回
.navigationBarBackButtonHidden(true) ✅ 可用(需手动恢复)
.navigationBarHidden(true) ❌ 禁用手势
嵌套新的 NavigationStack ❌ 禁用手势

✅ 总结

如果你想在 SwiftUI 中:

  • 自定义返回按钮
  • 隐藏系统返回按钮
  • 保留右滑返回手势

使用上述方式扩展 UINavigationController 即可,简单有效,全局生效。


欢迎点赞、收藏、评论交流 🙌