SwiftUI NavigationView navigationBarTitle LayoutConstraints issue
This is maybe related to the new (12.3) version of XCode that came out recently but I have a very simple SwiftUI View:
import SwiftUI
struct HomeView: View {
var body: some View {
NavigationView {
Text("Text")
.navigationBarTitle("My Title")
}
}
}
And I'm getting this warning in the console:
2020-12-15 18:25:06.506062-0800 Shopmatic[46177:9585655] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600003636d00 'BIB_Trailing_CB_Leading' H:[_UIModernBarButton:0x7faf15d0dc30]-(6)-[_UIModernBarButton:0x7faf15c17500'Your Lists'] (active)>",
"<NSLayoutConstraint:0x600003636d50 'CB_Trailing_Trailing' _UIModernBarButton:0x7faf15c17500'Your Lists'.trailing <= _UIButtonBarButton:0x7faf15c16140.trailing (active)>",
"<NSLayoutConstraint:0x600003631e50 'UINav_static_button_horiz_position' _UIModernBarButton:0x7faf15d0dc30.leading == UILayoutGuide:0x600002c18ee0'UIViewLayoutMarginsGuide'.leading (active)>",
"<NSLayoutConstraint:0x600003631ea0 'UINavItemContentGuide-leading' H:[_UIButtonBarButton:0x7faf15c16140]-(0)-[UILayoutGuide:0x600002c18e00'UINavigationBarItemContentLayoutGuide'] (active)>",
"<NSLayoutConstraint:0x600003617160 'UINavItemContentGuide-trailing' UILayoutGuide:0x600002c18e00'UINavigationBarItemContentLayoutGuide'.trailing == _UINavigationBarContentView:0x7faf15e10000.trailing (active)>",
"<NSLayoutConstraint:0x600003632580 'UIView-Encapsulated-Layout-Width' _UINavigationBarContentView:0x7faf15e10000.width == 0 (active)>",
"<NSLayoutConstraint:0x600003617520 'UIView-leftMargin-guide-constraint' H:|-(0)-[UILayoutGuide:0x600002c18ee0'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UINavigationBarContentView:0x7faf15e10000 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600003636d00 'BIB_Trailing_CB_Leading' H:[_UIModernBarButton:0x7faf15d0dc30]-(6)-[_UIModernBarButton:0x7faf15c17500'Your Lists'] (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
This simple example looks fine but when I do something a bit more complex:
import SwiftUI
struct ListDetailView: View {
var list: List
var body: some View {
NavigationView {
Text("Detail View")
.navigationBarTitle("Detail View Title")
.navigationBarTitleDisplayMode(.large)
.navigationBarItems(
trailing:
Button(action: {
print("Button Pressed")
}) {
Image(systemName: "ellipsis")
}
)
}
}
}
The Navigation Title areas layout is all screwed up:
Solution 1:
It had nothing to do with NavigationBarTitle
. .navigationTitle
is not deprecated. Seems whole issue is mainly with new Xcode 12.4 update, even for simple code:
var body: some View {
NavigationView{
Text("Hopefully will work this time")
.navigationTitle("Error with constains")
}
}
adding .navigationViewStyle(StackNavigationViewStyle())
fixes problem
var body: some View {
NavigationView{
Text("Yes it does!")
.navigationTitle("Wow it works")
}
}.navigationViewStyle(StackNavigationViewStyle())
PS. My first stackoverflow reply xD
Solution 2:
NavigationBarTitle
is deprecated from iOS 14.3
.
However if you still wish to use it, try to add
.navigationViewStyle(StackNavigationViewStyle())
on the navigationView
that will fix the warning.
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
Text("Hello, world!")
.padding()
Spacer()
}
.navigationBarTitle("Hey there", displayMode: .inline)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
The new way:
.navigationBarTitleDisplayMode(.inline)
.toolbar(content: {
ToolbarItem(placement: .principal, content: {
Text("Title")
})})
Solution 3:
Xcode 13.0 Beta 1
This is still causing a contraint error unless you add the StackNavigationViewStyle modifier.
However, the documentation for StackNavigationViewStyle
states:
Do not use this type directly. Instead, use stack.
var body: some View {
NavigationView {
Text("Text")
.navigationTitle("Title")
}
.navigationViewStyle(.stack)
}
Solution 4:
NavigationBarTitle is deprecated from iOS 14.3 https://developer.apple.com/documentation/swiftui/view/navigationbartitle(_:displaymode:)-8buvp
You can use NavigationTitle and .navigationViewStyle(StackNavigationViewStyle())
import SwiftUI
struct HomeView: View {
var body: some View {
NavigationView {
Text("Text")
.navigationBarTitle("Hey there", displayMode: .inline)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}