我知道在视图上您可以添加以下修饰符来修改导航栏以创建自定义后退按钮。
SomeView{ ... }
.navigationBarBackButtonHidden(true)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
mode.wrappedValue.dismiss()
} label: {
Image(systemName: "chevron.backward")
}
}
但是,我不想遍历整个应用程序到每个辅助视图并添加这些修改器。我考虑过创建一个可重用的标头组件,但目前,我只是想知道是否有一种方法可以覆盖后退按钮的系统默认值以影响整个应用程序。
目前还无法在
SwiftUI
中做到这一点。但是,您可以覆盖 UINavigationController
,但不建议这样做,因为 API
肯定会不时发生变化。
以
List
为例,我们曾经通过操纵UITableView
的外观来全局改变List
的背景颜色。从 iOS 16 开始,此解决方案不再有效。
扩展
View
并创建自定义修改器是您能做的最好的事情。
这个 UIKit 覆盖在 iOS 16 中对我有用(尽管后退按钮文本可能未对齐):
@main
struct TestApp: SwiftUI.App {
init() {
// Back button
let navBarAppearance = UINavigationBar.appearance()
if let image = UIImage(named: "arrow.back") {
navBarAppearance.backIndicatorImage = image
navBarAppearance.backIndicatorTransitionMaskImage = image
}
}
...
}
本机滑动模式也适用于 App 文件中的此覆盖(可在另一篇 StackOverflow 文章中找到):
/// Prevents custom back button dismiss actions from preventing native swiping interactions (i.e. swipe to go back)
extension UINavigationController: UIGestureRecognizerDelegate {
override open func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return viewControllers.count > 1
}
// To make it works also with ScrollView
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
true
}
}