AutoLayout将UILabel高度设置为零

在其他视图中,我有一个用于项目描述的UILabel ,所有这些都是在界面生成器中使用约束进行布置的 – 您可以在下面的图像中看到所有相关的约束条件。 行数也被设置为0

在这里输入图像说明

我没有设置高度约束,因为我想UILabel根据它包含的文本来resize。 相反,会发生什么事

 [self.view layoutIfNeeded]; 

被调用时, UILabel的高度被设置为0 。 即使我没有将其他文本设置到UILabel ,它也有一个在Interface Builder中设置的Item描述的默认值。

上面的项目标题标签的设置方式是相同的,但不会被压缩到0 ,所以我有点困惑。

任何人有这种行为的经验?

我设法通过在Interface Builder中将UILabelvertical compression resistance priority1000 (默认值为750 )来解决这个问题。

在这里输入图像说明

由于我的观点是embedded在另一个视图中的,父视图的底部依赖于最底层的子视图的底部,所以我只是推测没有高度约束的UILabel在布置视图的过程中被挤压了。 也许在链条的某个地方玩弄其他制约因素的优先次序可能会产生同样的结果,但是我无法成功地做到这一点。 上面的解决scheme,但是,工作,这对我来说是够好的。

希望这有助于某人。

在这个UIViewController AutoLayout不能满足你所​​设置的所有constraints ,因此它会消除你的UILabel上的那些constraints ,导致压缩状态。 你应该看看你的UIViewController中的其他constraints ,并将height contraint constraintspriority设置为更高的数字。

设置3约束

带领空间超级观察

2.空间到超视图

3.超空间来超视

然后

 @property (nonatomic, strong) IBOutlet UILabel *lbl; - (void) viewDidLoad{ [self.lbl sizeToFit]; } 

ctrl从标签拖动到自身>select高度>将高度常量设置为0,并将等号(==)更改为大于或等于(> =)

我认为你需要在你的标签上设置5个约束条件:

  • 领先的空间,超级观景
  • 尾随空间超级查看
  • 垂直空间到“项目”
  • 垂直空间到“名称”
  • 高度

然后添加一个IBOutlet在你的控制器的约束高度(让我们说labelHeight)。

所以在你的viewDidLoad中你可以设置这个约束值:

 @property (weak, nonatomic) IBOutlet UILabel *label; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelHeight; - (void) viewDidLoad{ [self.label sizeToFit]; labelHeight.constant = self.label.frame.size.height; }