SwiftUI 如何在保留后退按钮的同时隐藏导航栏
SwiftUI How To Hide The Navigation Bar While Keeping The Back Button
所以我试图在 SwiftUI 的详细信息视图中隐藏导航栏。从技术上讲,我已经通过在不同的视图中使用 init() 使其工作,但问题是它使整个应用程序的 navigationBar 透明,我只希望在一个视图中使用它。我没有在 DetailsView 中使用 init() 的原因是因为我有一个需要输入的变量,所以我不确定该怎么做!这是初始化程序的代码:
init() {
let navBarAppearance = UINavigationBar.appearance()
navBarAppearance.backgroundColor = .clear
navBarAppearance.barTintColor = .clear
navBarAppearance.tintColor = .black
navBarAppearance.setBackgroundImage(UIImage(), for: .default)
navBarAppearance.shadowImage = UIImage()
}
下面是内容视图和详细信息视图代码,其中包含 detailsView 中的 init():
// 内容视图 //
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(0..<5) { i in
NavigationLink(destination: DetailsView(test: 1)) {
Text("DetailsView \(i)")
}
}
}
.listStyle(InsetGroupedListStyle())
.navigationBarTitle("Test App")
}
}
}
// 详情视图 //
struct DetailsView: View {
var test: Int
var body: some View {
ScrollView {
Text("More Cool \(test)")
Text("Cool \(test)")
Text("Less Cool \(test)")
}
}
init(test: Int) {
self.test = 8
let navBarAppearance = UINavigationBar.appearance()
navBarAppearance.backgroundColor = .clear
navBarAppearance.barTintColor = .clear
navBarAppearance.tintColor = .black
navBarAppearance.setBackgroundImage(UIImage(), for: .default)
navBarAppearance.shadowImage = UIImage()
}
}
struct DetailsView_Previews: PreviewProvider {
static var previews: some View {
DetailsView(test: 8)
}
}
这是我的代码经过大量编辑的版本,但它显示了我遇到的问题。由于不需要传入变量,init() 仅在该视图中删除了栏。但是,使用该变量输入,它不仅将所有视图更改为数字“8”,而且甚至不隐藏导航栏。我不确定我是否只是做错了什么,也不确定这是否是正确的方法,但我们将不胜感激!
此外,附带说明一下,有人知道如何使用 NavigationView 隐藏 iOS14 中的状态栏吗?
我认为您尝试使用 UIKit 逻辑而不是 SwiftUI 逻辑。这就是我要用视图顶部的后退按钮隐藏导航栏的方法。
至于隐藏状态栏,我会使用.statusBar(hidden: true)。
但它似乎不适用于 iOS14。这可能是一个错误...您可以参考有关此主题的 Apple documentation。
struct DetailsView: View {
@Environment(\.presentationMode) var presentation
var test: Int
var body: some View {
ZStack(alignment: .topLeading) {
ScrollView {
Text("More Cool \(test)")
Text("Cool \(test)")
Text("Less Cool \(test)")
}
Button(action: { presentation.wrappedValue.dismiss() }) {
HStack {
Image(systemName: "chevron.left")
.foregroundColor(.blue)
.imageScale(.large)
Text("Back")
.font(.title3)
.foregroundColor(.blue)
}
}
.padding(.leading)
.padding(.top)
}
.navigationTitle(Text(""))
.navigationBarHidden(true)
.statusBar(hidden: true)
}
}
所以我试图在 SwiftUI 的详细信息视图中隐藏导航栏。从技术上讲,我已经通过在不同的视图中使用 init() 使其工作,但问题是它使整个应用程序的 navigationBar 透明,我只希望在一个视图中使用它。我没有在 DetailsView 中使用 init() 的原因是因为我有一个需要输入的变量,所以我不确定该怎么做!这是初始化程序的代码:
init() {
let navBarAppearance = UINavigationBar.appearance()
navBarAppearance.backgroundColor = .clear
navBarAppearance.barTintColor = .clear
navBarAppearance.tintColor = .black
navBarAppearance.setBackgroundImage(UIImage(), for: .default)
navBarAppearance.shadowImage = UIImage()
}
下面是内容视图和详细信息视图代码,其中包含 detailsView 中的 init():
// 内容视图 //
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(0..<5) { i in
NavigationLink(destination: DetailsView(test: 1)) {
Text("DetailsView \(i)")
}
}
}
.listStyle(InsetGroupedListStyle())
.navigationBarTitle("Test App")
}
}
}
// 详情视图 //
struct DetailsView: View {
var test: Int
var body: some View {
ScrollView {
Text("More Cool \(test)")
Text("Cool \(test)")
Text("Less Cool \(test)")
}
}
init(test: Int) {
self.test = 8
let navBarAppearance = UINavigationBar.appearance()
navBarAppearance.backgroundColor = .clear
navBarAppearance.barTintColor = .clear
navBarAppearance.tintColor = .black
navBarAppearance.setBackgroundImage(UIImage(), for: .default)
navBarAppearance.shadowImage = UIImage()
}
}
struct DetailsView_Previews: PreviewProvider {
static var previews: some View {
DetailsView(test: 8)
}
}
这是我的代码经过大量编辑的版本,但它显示了我遇到的问题。由于不需要传入变量,init() 仅在该视图中删除了栏。但是,使用该变量输入,它不仅将所有视图更改为数字“8”,而且甚至不隐藏导航栏。我不确定我是否只是做错了什么,也不确定这是否是正确的方法,但我们将不胜感激!
此外,附带说明一下,有人知道如何使用 NavigationView 隐藏 iOS14 中的状态栏吗?
我认为您尝试使用 UIKit 逻辑而不是 SwiftUI 逻辑。这就是我要用视图顶部的后退按钮隐藏导航栏的方法。 至于隐藏状态栏,我会使用.statusBar(hidden: true)。 但它似乎不适用于 iOS14。这可能是一个错误...您可以参考有关此主题的 Apple documentation。
struct DetailsView: View {
@Environment(\.presentationMode) var presentation
var test: Int
var body: some View {
ZStack(alignment: .topLeading) {
ScrollView {
Text("More Cool \(test)")
Text("Cool \(test)")
Text("Less Cool \(test)")
}
Button(action: { presentation.wrappedValue.dismiss() }) {
HStack {
Image(systemName: "chevron.left")
.foregroundColor(.blue)
.imageScale(.large)
Text("Back")
.font(.title3)
.foregroundColor(.blue)
}
}
.padding(.leading)
.padding(.top)
}
.navigationTitle(Text(""))
.navigationBarHidden(true)
.statusBar(hidden: true)
}
}