UIStackView with UILabels in Xcode 7.3

2019-01-25 10:38发布

问题:

Since I've updated to Xcode 7.3 I have a problem with UIStackView. If I create an empty project and just put two UILabels in UIStackView with default hugging and compression priorities, it shows me AutoLayout misplacement error. It even doesn't work with one(!) UILabel in UIStackView, so priorities doesn't matter (as I think, maybe there is the problem).

As I remember in Xcode prior 7.3 everything was fine. I checked on two MacBook Pro separately, it's the same issue.

Does anybody know how to fix it?

回答1:

This is a bug appears in Xcode 7.3, so you can ignore it as what he said matt.

The problem

The storyboard can not calculate the intrinsic content size of subviews when you use UIStackView

Solution

If you hate seeing warnings in your storyboard you can fixe it like below :

You should do these steps for each subview of your UIStackView

  • Tap the warning of your subview
  • Tap "Update frames" option
  • Choose "Placeholder" of the subview intrinsic size in the fourth menu in the inspector view

Like that you will not see warnings, and you can see if any ambiguities exist

The disadvantage is you should do this steps each time you change your subview (example: changing the size of text of an UILabel)

Hoping that Apple fixes this bug in the next release



回答2:

Ignore the warnings. The storyboard has never quite understood stack views. The constraints will be correct at runtime and that's all that matters.



回答3:

I have a different trick for eliminating the warnings and making 'update frames' work properly.

Advantage:

Doesn't require changing placeholder values every time text changes

Disadvantage:

Extra views that are unnecessary when Xcode 8 comes out

Steps:

  • Embed each UILabel inside a UIView.
  • Constrain the UIView to size itself based on the label (match leading, trailing, bottom, and top)

It seems like UIStackView (in Xcode 7) can't understand the intrinsic content size of a label, but CAN understand the intrinsic content size of a view - so put the label in a view and presto!