Ambiguous layout warnings for UILabels in UITableViewCell

12,725

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.

Share:
12,725
koen
Author by

koen

Updated on June 21, 2022

Comments

  • koen
    koen almost 2 years

    I have two UILabel views next to each other in an UITableViewCell. 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 right UILabel, and therefore they are not top-aligned. Looking into it more, I found that hasAmbiguousLayout returns YES 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 first UILabel, 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 the contentView of the cell. Both labels have set translatesAutoresizingMaskIntoConstraints to NO.

    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:

    enter image description here