Ambiguous layout warnings for UILabels in UITableViewCell
Solution 1
I solved it by adding for the right UILabel
:
[self.bodyLabel setContentHuggingPriority: UILayoutPriorityFittingSizeLevel forAxis: UILayoutConstraintAxisHorizontal];
The other thing is that I was testing for ambiguity in updateConstraints
, while I should have done it at the end of layoutSubviews
Solution 2
Ah! Have you turned off the
translatesAutoresizingMaskIntoConstraints
property for every subview in the view hierarchy of the cell.contentView?
The output shows evidence of clashes between your auto layout and the default autoresizing behaviour. In xibs this can be turned off for everything with a checkbox, but in code you have to do it on a per view level.
koen
Updated on June 21, 2022Comments
-
koen almost 2 years
I have two
UILabel
views next to each other in anUITableViewCell
. The left one has one line, the right one can have multiple lines and uses whatever horizontal space that is left. Both labels have the same distance from the top of the cell. The height of the cell is dictated by the height of the right label. In some cases, I see unwanted additional space above and under the rightUILabel
, and therefore they are not top-aligned. Looking into it more, I found thathasAmbiguousLayout
returnsYES
for both labels.When I call
constraintsAffectingLayoutForAxis
in the debugger, I get the following output:(lldb) po [0x7b769520 constraintsAffectingLayoutForAxis:0] <__NSArrayM 0x7b6cb340>( <NSAutoresizingMaskLayoutConstraint:0x7b76abf0 h=--& v=--& 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UITableViewCellContentView:0x7b768fc0] (Names: '|':MyTVCell:0x7b769330'MyTVCell' )>, <NSLayoutConstraint:0x7b76b010 H:|-(15)-[UILabel:0x7b769520'Number'] (Names: '|':UITableViewCellContentView:0x7b768fc0 )>, <NSContentSizeLayoutConstraint:0x7b769a90 H:[UILabel:0x7b769520'Number'(131)] Hug:250 CompressionResistance:750> )
For a second
UILabel
that is positioned to the right of the firstUILabel
, I get this:(lldb) po [0x7b769710 constraintsAffectingLayoutForAxis:0] <__NSArrayM 0x7b6cb9e0>( <NSContentSizeLayoutConstraint:0x7b769a90 H:[UILabel:0x7b769520'Number'(131)] Hug:250 CompressionResistance:750>, <NSAutoresizingMaskLayoutConstraint:0x7b76abf0 h=--& v=--& 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UITableViewCellContentView:0x7b768fc0] (Names: '|':MyTVCell:0x7b769330'MyTVCell' )>, <NSLayoutConstraint:0x7b76b010 H:|-(15)-[UILabel:0x7b769520'Number'] (Names: '|':UITableViewCellContentView:0x7b768fc0 )>, <NSLayoutConstraint:0x7b76b230 H:[UILabel:0x7b769520'Number']-(15)-[UILabel:0x7b769710'Q12472']>, <NSLayoutConstraint:0x7b76ab90 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7b768fc0(320)]>, <NSLayoutConstraint:0x7b76b310 UILabel:0x7b769710'Q12472'.trailing == UITableViewCellContentView:0x7b768fc0.trailing - 15> )
Could anyone explain based on the output above why these labels have an ambiguous layout?
Update: The
NSAutoresizingMaskLayoutConstraint
constraint belongs to thecontentView
of the cell. Both labels have settranslatesAutoresizingMaskIntoConstraints
toNO
.Update 2: Here are the constraints I have for the contentView and the two labels:
2015-02-26 07:35:25.559 contentView constraints: ( "<NSLayoutConstraint:0x7be541e0 V:|-(8)-[UILabel:0x7be537d0] (Names: '|':UITableViewCellContentView:0x7be535a0 )>", "<NSLayoutConstraint:0x7be54240 H:|-(15)-[UILabel:0x7be537d0] (Names: '|':UITableViewCellContentView:0x7be535a0 )>", "<NSLayoutConstraint:0x7be54310 V:|-(8)-[UILabel:0x7be53990] (Names: '|':UITableViewCellContentView:0x7be535a0 )>", "<NSLayoutConstraint:0x7be54340 H:[UILabel:0x7be537d0]-(15)-[UILabel:0x7be53990]>", "<NSLayoutConstraint:0x7be54370 UILabel:0x7be53990.trailing == UITableViewCellContentView:0x7be535a0.trailing - 15>", "<NSLayoutConstraint:0x7be543c0 UILabel:0x7be53990.bottom == UITableViewCellContentView:0x7be535a0.bottom - 8>", "<NSContentSizeLayoutConstraint:0x7be53cd0 H:[UILabel:0x7be537d0(109)] Hug:250 CompressionResistance:750>", "<NSContentSizeLayoutConstraint:0x7be53d10 V:[UILabel:0x7be537d0(21)] Hug:250 CompressionResistance:750>", "<NSContentSizeLayoutConstraint:0x7be53eb0 H:[UILabel:0x7be53990(20)] Hug:250 CompressionResistance:750>", "<NSContentSizeLayoutConstraint:0x7be53f10 V:[UILabel:0x7be53990(20)] Hug:250 CompressionResistance:750>" ) 2015-02-26 07:35:25.560 left label constraints: ( "<NSContentSizeLayoutConstraint:0x7be53cd0 H:[UILabel:0x7be537d0(109)] Hug:250 CompressionResistance:750>", "<NSContentSizeLayoutConstraint:0x7be53d10 V:[UILabel:0x7be537d0(21)] Hug:250 CompressionResistance:750>" ) 2015-02-26 07:35:25.561 right label constraints:( "<NSContentSizeLayoutConstraint:0x7be53eb0 H:[UILabel:0x7be53990(20)] Hug:250 CompressionResistance:750>", "<NSContentSizeLayoutConstraint:0x7be53f10 V:[UILabel:0x7be53990(20)] Hug:250 CompressionResistance:750>" )
Here is a picture showing the constraints I have and what goes wrong: