13

Environment: Xcode Version 12.3 (12C33)
Version 12.3 (12C33)

I notice that the NavigationTitle breaks the autolayout after updating to Xcode 12.3 RC.
Here's a simple example (revised to modern syntax per comment):

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack(alignment: .center, spacing: 10) {
                Text("Hello, world!")
                    .padding()
            }.navigationTitle(Text("Greetings World!"))
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Here's what I get upon running this:

2020-12-09 11:42:19.994389-0800 UICheck[26092:799713] [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:0x60000170e1c0 'BIB_Trailing_CB_Leading' H:[_UIModernBarButton:0x7feb5ac096e0]-(6)-[_UIModernBarButton:0x7feb5ac06db0'Greetings World!']   (active)>",
    "<NSLayoutConstraint:0x60000170e210 'CB_Trailing_Trailing' _UIModernBarButton:0x7feb5ac06db0'Greetings World!'.trailing <= _UIButtonBarButton:0x7feb5ac066a0.trailing   (active)>",
    "<NSLayoutConstraint:0x60000170ef80 'UINav_static_button_horiz_position' _UIModernBarButton:0x7feb5ac096e0.leading == UILayoutGuide:0x600000d5db20'UIViewLayoutMarginsGuide'.leading   (active)>",
    "<NSLayoutConstraint:0x60000170efd0 'UINavItemContentGuide-leading' H:[_UIButtonBarButton:0x7feb5ac066a0]-(0)-[UILayoutGuide:0x600000d5da40'UINavigationBarItemContentLayoutGuide']   (active)>",
    "<NSLayoutConstraint:0x60000170ae90 'UINavItemContentGuide-trailing' UILayoutGuide:0x600000d5da40'UINavigationBarItemContentLayoutGuide'.trailing == _UINavigationBarContentView:0x7feb5ae185f0.trailing   (active)>",
    "<NSLayoutConstraint:0x60000170f750 'UIView-Encapsulated-Layout-Width' _UINavigationBarContentView:0x7feb5ae185f0.width == 0   (active)>",
    "<NSLayoutConstraint:0x60000170b250 'UIView-leftMargin-guide-constraint' H:|-(0)-[UILayoutGuide:0x600000d5db20'UIViewLayoutMarginsGuide'](LTR)   (active, names: '|':_UINavigationBarContentView:0x7feb5ae185f0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60000170e1c0 'BIB_Trailing_CB_Leading' H:[_UIModernBarButton:0x7feb5ac096e0]-(6)-[_UIModernBarButton:0x7feb5ac06db0'Greetings World!']   (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 is the source of the problem:

enter image description here

I suspect this to be another Apple Bug.
Being that I'm using the supplied .navigationBarTitle view, how can I fix this?

Asperi
  • 228,894
  • 20
  • 464
  • 690
Frederick C. Lee
  • 9,019
  • 17
  • 64
  • 105

1 Answers1

4

Updated for Xcode 13

To solve the LayoutConstraints error on SwiftUI NavigationView, make it conform to this style:

.navigationViewStyle(StackNavigationViewStyle()) on Xcode 12

.navigationViewStyle(.stack) on Xcode 13

struct ContentView: View {

  var body: some View {
    NavigationView {
      VStack(alignment: .center, spacing: 10) {
        Text("Hello world!")
          .padding()
      }
      .navigationTitle("Greetings World!")
      .navigationBarTitleDisplayMode(.inline)
    }
    .navigationViewStyle(.stack)
  }
}
Roland Lariotte
  • 2,606
  • 1
  • 16
  • 40
  • 1
    This didn't solve the warnings for me, it still occurred. Turns out `.navigationViewStyle(StackNavigationViewStyle())` needs to be added to the NavigationView, not to a view within it. – Patrick Jul 24 '21 at 19:46
  • The code is updated for Xcode 13, and fixed for Xcode 12 which do not show the log error in the console. – Roland Lariotte Jul 26 '21 at 18:36
  • 1
    With Xcode 13.2.1 and iOS 15, 15.2 on Simulator iPhone, there are again a lot of Constraints Conflicts. No conflicts on iOS 14 Simulator. Same code as of Jul 26 '21. – CouchDeveloper Jan 07 '22 at 15:17