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
即可,簡單有效,全局生效。
歡迎點贊、收藏、評論交流 🙌