我最近开始在SwiftUI中工作,得出的结论是使用导航还不是很好。我正在尝试实现以下目标。我终于设法摆脱了半透明的背景,而没有导致应用程序崩溃,但是现在我遇到了下一个问题。如何摆脱navbaritem内部的“后退”文本?
我通过在SceneDelegate.swift
文件中设置默认外观来实现上述观点。
let newNavAppearance = UINavigationBarAppearance()
newNavAppearance.configureWithTransparentBackground()
newNavAppearance.setBackIndicatorImage(UIImage(named: "backButton"), transitionMaskImage: UIImage(named: "backButton"))
newNavAppearance.titleTextAttributes = [
.font: UIFont(name: GTWalsheim.bold.name, size: 18)!,
.backgroundColor: UIColor.white
]
UINavigationBar.appearance().standardAppearance = newNavAppearance
实现此目标的一种可能方法是覆盖导航栏项目,但是此问题的创建者已经说过,它有一个缺点(SwiftUI Custom Back Button Text for NavigationView),在您覆盖导航之后,后退手势将停止工作酒吧项目。这样我也想知道如何设置后退按钮的前景色。现在它具有默认的蓝色,但是我想用另一种颜色覆盖。
答案 0 :(得分:8)
其实很简单。以下解决方案是我做出的最快、最干净的解决方案。
例如,将其放在 SceneDelegate 的底部。
extension UINavigationController {
// Remove back button text
open override func viewWillLayoutSubviews() {
navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
这将从您应用中的每个 NavigationView (UINavigationController) 中删除后退按钮文本。
答案 1 :(得分:4)
我发现了一种直接使用SwiftUI删除后退按钮文本并保留原始人字形的简单方法。
import SwiftUI
struct ContentView: View {
@Environment(\.presentationMode) var presentation
var body: some View {
VStack {
// Your main view code here
}
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: Button(action: { presentation.wrappedValue.dismiss() }) {
Image(systemName: "chevron.left")
.foregroundColor(.blue)
.imageScale(.large)
})
}
}
答案 2 :(得分:4)
支持@Pitchbloas 提供的解决方案,此方法只涉及将 backButtonDisplayMode
属性设置为 .minimal
:
extension UINavigationController {
open override func viewWillLayoutSubviews() {
navigationBar.topItem?.backButtonDisplayMode = .minimal
}
}
答案 3 :(得分:2)
因此,我实际上得到了以下切实可行的解决方案。我正在覆盖这样的导航栏项
.navigationBarItems(leading:
Image("backButton")
.foregroundColor(.blue)
.onTapGesture {
self.presentationMode.wrappedValue.dismiss()
}
)
唯一的问题是后退手势无法正常工作,因此可以通过实际扩展UINavigationController
extension UINavigationController: UIGestureRecognizerDelegate {
override open func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return viewControllers.count > 1
}
}
现在,它看起来完全符合我的要求,该解决方案有点笨拙……但它现在可以正常工作,希望SwiftUI会成熟一点,以便可以更轻松地实现。
答案 4 :(得分:1)
标准后退按钮标题取自上一屏幕的导航栏标题。
可以通过以下方法获得所需的效果:
struct TestBackButtonTitle: View {
@State private var hasTitle = true
var body: some View {
NavigationView {
NavigationLink("Go", destination:
Text("Details")
.onAppear {
self.hasTitle = false
}
.onDisappear {
self.hasTitle = true
}
)
.navigationBarTitle(self.hasTitle ? "Master" : "")
}
}
}