Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting constraints to work in size classes

Tags:

xcode

ios

So, I'm playing around with size classes in Xcode 6 beta. I set up some constraints on an image such that it is in a different position based on size classes corresponding to iPhone portrait and landscape.

The constraints are visible in the images below. As you can see, when I am in Compact/Compact, some constraints are "installed" while others are not, and in Compact/Regular, other constraints are installed.

Compact/CompactCompact/Regular

However, I get an error (slightly visible in both screenshots) basically claiming that my uninstalled constraints are interfering with my installed constraints (which, if they were run at the same time, is true) but shouldn't the uninstalled constraints for each size class not even be run? None of the installed constraints cause issues with each other.

The error that shows up is:

2014-06-30 21:14:26.215 TV Tracker[26417:1434692] SetAppThreadPriority: setpriority failed with error 45
2014-06-30 21:14:26.372 TV Tracker[26417:1434692] 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:0x10bb11da0 H:|-(24)-[UILabel:0x10bb4db70'TV Tracker uses your Trak...']   (Names: '|':UIControl:0x10bb2db60 )>",
"<NSLayoutConstraint:0x10bb11df0 H:[UIImageView:0x10bb44740]-(>=18)-[UILabel:0x10bb4db70'TV Tracker uses your Trak...']>",
"<NSLayoutConstraint:0x10bb2f420 H:|-(20)-[UIButton:0x10bb35470'Sign In']   (Names: '|':UIControl:0x10bb2db60 )>",
"<NSLayoutConstraint:0x10bb2f470 UIButton:0x10bb35470'Sign In'.leading == UIImageView:0x10bb44740.leading>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10bb11df0 H:[UIImageView:0x10bb44740]-(>=18)-[UILabel:0x10bb4db70'TV Tracker uses your Trak...']>

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.
2014-06-30 21:14:26.373 TV Tracker[26417:1434692] 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:0x10bb11e90 H:[UILabel:0x10bb4db70'TV Tracker uses your Trak...']-(23)-|   (Names: '|':UIControl:0x10bb2db60 )>",
"<NSLayoutConstraint:0x10bb11ee0 UILabel:0x10bb4db70'TV Tracker uses your Trak...'.trailing == UIButton:0x10bb44ec0'Register'.trailing>",
"<NSLayoutConstraint:0x10bb2f510 H:[UIButton:0x10bb44ec0'Register']-(20)-|   (Names: '|':UIControl:0x10bb2db60 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10bb11ee0 UILabel:0x10bb4db70'TV Tracker uses your Trak...'.trailing == UIButton:0x10bb44ec0'Register'.trailing>

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.
2014-06-30 21:14:26.388 TV Tracker[26417:1434692] 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) 
(
"<NSAutoresizingMaskLayoutConstraint:0x10bb49e10 h=-&- v=-&- UIControl:0x10bb2db60.width == UIViewControllerWrapperView:0x10d102000.width>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb55d10 h=-&- v=-&- UIViewControllerWrapperView:0x10d102000.width == UINavigationTransitionView:0x10bc6f770.width>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb3cda0 h=-&- v=-&- UINavigationTransitionView:0x10bc6f770.width == UILayoutContainerView:0x10bc6e3e0.width>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb29960 h=-&- v=-&- UILayoutContainerView:0x10bc6e3e0.width == UITransitionView:0x10bc73670.width>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb559e0 h=-&- v=-&- UITransitionView:0x10bc73670.width == UIWindow:0x10d068e70.width>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb56880 h=--- v=--- H:[UIWindow:0x10d068e70(320)]>",
"<NSLayoutConstraint:0x10bb2f420 H:|-(20)-[UIButton:0x10bb35470'Sign In']   (Names: '|':UIControl:0x10bb2db60 )>",
"<NSLayoutConstraint:0x10bb2f470 UIButton:0x10bb35470'Sign In'.leading == UIImageView:0x10bb44740.leading>",
"<NSLayoutConstraint:0x10bb44570 UIControl:0x10bb2db60.centerX == UIImageView:0x10bb44740.centerX>",
"<NSLayoutConstraint:0x10bb3c840 H:[UIImageView:0x10bb44740(92)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10bb3c840 H:[UIImageView:0x10bb44740(92)]>

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.
2014-06-30 21:14:26.389 TV Tracker[26417:1434692] 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) 
(
"<_UILayoutSupportConstraint:0x10bd1c8a0 V:[_UILayoutGuide:0x10bb4acb0(64)]>",
"<_UILayoutSupportConstraint:0x10bd1fbf0 V:|-(0)-[_UILayoutGuide:0x10bb4acb0]   (Names: '|':UIControl:0x10bb2db60 )>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb56d40 h=-&- v=-&- UIControl:0x10bb2db60.height == UIViewControllerWrapperView:0x10d102000.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb56c60 h=-&- v=-&- UIViewControllerWrapperView:0x10d102000.height == UINavigationTransitionView:0x10bc6f770.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb3cbb0 h=-&- v=-&- UINavigationTransitionView:0x10bc6f770.height == UILayoutContainerView:0x10bc6e3e0.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb4a920 h=-&- v=-&- UILayoutContainerView:0x10bc6e3e0.height == UITransitionView:0x10bc73670.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb0e3a0 h=-&- v=-&- UITransitionView:0x10bc73670.height == UIWindow:0x10d068e70.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb44d20 h=--- v=--- V:[UIWindow:0x10d068e70(568)]>",
"<NSLayoutConstraint:0x10bb44520 UIControl:0x10bb2db60.centerY == UIImageView:0x10bb44740.centerY>",
"<NSLayoutConstraint:0x10bb445c0 V:[_UILayoutGuide:0x10bb4acb0]-(24)-[UIImageView:0x10bb44740]>",
"<NSLayoutConstraint:0x10bb49b60 V:[UIImageView:0x10bb44740(100)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10bb49b60 V:[UIImageView:0x10bb44740(100)]>

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.
2014-06-30 21:14:26.396 TV Tracker[26417:1434692] 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) 
(
"<_UILayoutSupportConstraint:0x10bd13470 V:[_UILayoutGuide:0x10bb4c690(0)]>",
"<_UILayoutSupportConstraint:0x10bd13410 _UILayoutGuide:0x10bb4c690.bottom == UIControl:0x10bb2db60.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb56d40 h=-&- v=-&- UIControl:0x10bb2db60.height == UIViewControllerWrapperView:0x10d102000.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb56c60 h=-&- v=-&- UIViewControllerWrapperView:0x10d102000.height == UINavigationTransitionView:0x10bc6f770.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb3cbb0 h=-&- v=-&- UINavigationTransitionView:0x10bc6f770.height == UILayoutContainerView:0x10bc6e3e0.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb4a920 h=-&- v=-&- UILayoutContainerView:0x10bc6e3e0.height == UITransitionView:0x10bc73670.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb0e3a0 h=-&- v=-&- UITransitionView:0x10bc73670.height == UIWindow:0x10d068e70.height>",
"<NSAutoresizingMaskLayoutConstraint:0x10bb44d20 h=--- v=--- V:[UIWindow:0x10d068e70(568)]>",
"<NSLayoutConstraint:0x10bb11e40 UIControl:0x10bb2db60.centerY == UILabel:0x10bb4db70'TV Tracker uses your Trak...'.centerY + 0.25>",
"<NSLayoutConstraint:0x10bb2f3d0 V:[UILabel:0x10bb4db70'TV Tracker uses your Trak...']-(91)-[_UILayoutGuide:0x10bb4c690]>",
"<NSLayoutConstraint:0x10bb2d790 V:[UILabel:0x10bb4db70'TV Tracker uses your Trak...'(69)]>"
)

Will attempt to recover by breaking constraint 

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.

My sidebar for the Compact/Compact constraints look like C/C sidebar

My sidebar for the Compact/Regular constraints look like C/R sidebar

My view hierarchy for this login controller: view hierarchy

like image 404
Atharv Vaish Avatar asked Jun 30 '14 03:06

Atharv Vaish


1 Answers

I had the same problem the first time I tried this feature, until I realized what the "+" buttons were telling me. At first, I had changed size class and deleted a view and added a view, or deleted a constraint and added a constraint. That is wrong! You cannot delete or add views or constraints on a per-size-class basis; they must all be there in every size class — only some of them are marked "installed" for that size class, and others are not.

Here's some further advice.

  • Look at the top of your screen shot. You are getting warnings from Interface Builder - and ignoring them. Don't ignore them! Those warnings are telling you that your constraints are not doing what you think they are.

  • Show the view hierarchy list at the left of the canvas (it is hidden in your screen shots) and keep looking at and working on every combination of size class until there are no more warnings. It also tells you what constraints and views are present in the mass case and for the particular size class case you are looking at (see screen shot below).

  • Use the "+" buttons in the attributes inspector on the right to make certain that you have values for every relevant size class case. You do not add or remove constraints or classes: you add "installed" buttons and mark their size class and check or uncheck them (again, see screen shot).

enter image description here

Finally, use the Preview Assistant to make certain the view will look the way you expect. See cute animation below.

enter image description here

like image 136
matt Avatar answered Sep 28 '22 14:09

matt