Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SwiftUI NavigationView navigationBarTitle LayoutConstraints issue

Tags:

ios

swift

swiftui

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:

enter image description here

like image 548
goddamnyouryan Avatar asked Dec 16 '20 02:12

goddamnyouryan


People also ask

How do I disable the navigation back button in SwiftUI?

The . navigationBarBackButtonHidden(true) will hide the back button.

How do I manage navigation in SwiftUI?

SwiftUI's NavigationLink has a second initializer that has an isActive parameter, allowing us to read or write whether the navigation link is currently active. In practical terms, this means we can programmatically trigger the activation of a navigation link by setting whatever state it's watching to true.


2 Answers

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

like image 154
Kamran Maximoff Avatar answered Sep 17 '22 08:09

Kamran Maximoff


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")   })})     
like image 27
Hezy Ziv Avatar answered Sep 21 '22 08:09

Hezy Ziv