问题
I'm having Three Views. I want to hide the navigation bar in the third View. Even if I give .navigationBarHidden(true)
the navigation bar is displaying!
I couldn't find where I'm doing wrong. I've attached my code and the resulting screenshot below.
Xcode version - 11.1
struct ContentViewOne: View {
var body: some View {
NavigationView {
ZStack {
Color.yellow.edgesIgnoringSafeArea(.all)
VStack(spacing: 20) {
Text("View One")
NavigationLink(destination: ContentViewTwo()) {
Text("Navigate to View Two")
.foregroundColor(.white)
.padding()
.background(Color.red)
}
}
}
.navigationBarTitle("View One")
}
}
}
struct ContentViewTwo: View {
var body: some View {
ZStack {
Color.green.edgesIgnoringSafeArea(.all)
VStack(spacing: 20) {
Text("View Two")
NavigationLink(destination: ContentViewThree()) {
Text("Navigate to View Three")
.foregroundColor(.white)
.padding()
.background(Color.red)
}
}
}
.navigationBarTitle("View Two")
}
}
struct ContentViewThree: View {
var body: some View {
ZStack {
Color.gray.edgesIgnoringSafeArea(.all)
Text("View Three")
}
.navigationBarTitle("View Three")
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
}
}
回答1:
NOTE: (For some reason it works in some cases) SwiftUI
requires that you need to .navigationBarTitle
for .navigationBarHidden
to work properly.
NavigationView {
ScrollView() {
......
}.
.navigationBarTitle("") //this must be empty
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
}
回答2:
You need to add .navigationBarHidden(true) on navigationView, or if you have NavigationLink you need to add on the Link
NavigationLink("",
destination: Text("TEST"),
tag: linkValue,
selection: $linksNavigator.selection)
**.navigationBarHidden(true)**
回答3:
To hide the NavigationBar
specifically in your 3rd View
. You have to remove .navigationBarTitle("View Three")
and the bar gets hidden:
struct ContentViewThree: View {
var body: some View {
ZStack {
Color.gray.edgesIgnoringSafeArea(.all)
Text("View Three")
}
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
}
}
回答4:
Posting this for more visibility in dealing with SwiftUI NavigationBar not hiding, or still taking up space when it is hidden:
.navigationBarHidden(true)
.navigationBarTitle("", displayMode: .inline)
.edgesIgnoringSafeArea([.top, .bottom])
That sets a title (hack sometimes required for old swiftUI versions), hides the bar, but also tells the rendering engine to ignore any safe areas that reserve space for the navigation bar (presumptively).
回答5:
I tried multiple solutions, including UINavigationControllerDelegate and nothing seems to make the navigationBar permanently hidden. Until I tried KVO :)
So if you want a permanent solution, use this:
struct NoBarNavigationView<Content: View>: View {
private let content: Content
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
NavigationView {
content
.introspectNavigationController { (UINavigationController) in
NavigationControllerDelegate.shared.becomeDelegate(of: UINavigationController)
}
}
}
}
class NavigationControllerDelegate: NSObject {
static let shared = NavigationControllerDelegate()
func becomeDelegate(of navigationController: UINavigationController) {
navigationController.isNavigationBarHidden = true
navigationController.navigationBar.isHidden = true
navigationController.navigationBar.addObserver(self, forKeyPath: "alpha", options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// This is necessary to ensure the UINavigationBar remains hidden
if let navigationBar = object as? UINavigationBar {
navigationBar.isHidden = true
}
}
}
Happy coding!
EDIT: As pointed out in the comments, I am using:
import Introspect
GitHub link
来源:https://stackoverflow.com/questions/59027529/navigation-bar-hide-is-not-working-in-swiftui