Reputation: 8365
Is there a way to (temporarily) disable autolayout error/warning messages:
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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x170098420 H:[UIView:0x15c62c100(2)]>",
"<NSLayoutConstraint:0x170098600 UIView:0x15c6294f0.leading == UIView:0x15c628d40.leadingMargin - 8>",
"<NSLayoutConstraint:0x170098650 H:[UIView:0x15c6294f0]-(0)-[UIView:0x15c62b750]>",
"<NSLayoutConstraint:0x1700986a0 UIView:0x15c62b750.width == UIView:0x15c6294f0.width>",
"<NSLayoutConstraint:0x1700986f0 UIView:0x15c628d40.trailingMargin == UIView:0x15c62b750.trailing - 8>",
"<NSLayoutConstraint:0x170098880 H:[UIView:0x15c6294f0]-(0)-[UIView:0x15c62c100]>",
"<NSLayoutConstraint:0x1700988d0 UIView:0x15c628d40.centerX == UIView:0x15c62c100.centerX + 1>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x170098420 H:[UIView:0x15c62c100(2)]>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Upvotes: 117
Views: 34541
Reputation: 8322
Swift 4.0 & Swift 5.0 Solution:
// Hide Autolayout Warning
UserDefaults.standard.set(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")
Swift 3.0 Solution:
// Hide Autolayout Warning
UserDefaults.standard.setValue(false, forKey:"_UIConstraintBasedLayoutLogUnsatisfiable")
Upvotes: 30
Reputation: 1623
One more option is to temporarily put -_UIConstraintBasedLayoutLogUnsatisfiable NO
(notice the dash) into Arguments Passed On Launch
menu, under the Product -> Scheme -> Edit Scheme... -> Run -> Arguments
tab (you can also open this menu by pressing ⇧+⌘+<), like this:
Upvotes: 59
Reputation: 3057
Did some decompiling and there's actually a way:
for Swift 5
UserDefaults.standard.set(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")
Objective-C
[[NSUserDefaults standardUserDefaults] setValue:@(NO) forKey:@"_UIConstraintBasedLayoutLogUnsatisfiable"];
Now you'll only get notified that "_UIConstraintBasedLayoutLogUnsatisfiable is OFF".
Obligatory reminder for anyone reading this: this should be last resort, for tips on debugging and fixing constraint issues see WWDC's "Mysteries of Auto Layout" sessions: part 1 and part 2.
Upvotes: 279
Reputation: 2274
for anyone who is wondering how to do this macOS / osx with AppKit/Cocoa
UserDefaults.standard.set(false, forKey: "NSConstraintBasedLayoutLogUnsatisfiable")
UserDefaults.standard.set(false, forKey: "__NSConstraintBasedLayoutLogUnsatisfiable")
Upvotes: 9
Reputation: 12109
I have tried to solve this using lldb and I found a solution:
If your App encounters a layout issue, the execution is paused. With the instruction "thread return", the UIViewAlertForUnsatisfiableConstraints function which prints out the error is forced to return before the warning message is printed into the console.
With the "c" command the execution of your app is continued (Note: "Automatically continue after evaluating actions" does somehow not work in this case)
However with these automatic actions the breakpoint is likely to behave strangely if it gets hit two times in a row which will cause your app to crash. To solve this you can remove the breakpoint actions and enter the commands manually when the debugger pauses the execution of the program.
Upvotes: 3