自动布局设置UILabel高度为零

13

我有一个UILabel用于显示物品描述,它和其他视图一起使用约束在Interface Builder中布局 - 您可以在下面的图像中看到所有相关的约束条件。行数也设置为0

输入图像说明

我没有设置高度约束,因为我希望UILabel根据其包含的文本进行调整大小。相反,发生的情况是,在文本更改后,UILabel的高度仍然保持不变

[self.view layoutIfNeeded];

UILabel被调用时,其高度会设置为0。即使我不将其他文本设置为UILabel,它在Interface Builder中具有项目描述的默认值。

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

有人有过这样的经历吗?


您的控制台中是否有任何AutoLayout约束错误?AutoLayout是否因为冲突而放弃了某些约束? - Alex
我知道你不想为那个UILabel设定一个固定高度,但如果你这样做会发生什么?在控制台中会出现任何AutoLayout约束冲突吗? - Alex
我认为你需要删除“顶部间距”或“底部间距”中的一个。否则,高度将由这些约束设置。不过我可能是错的... - Yaser
嗨,Yaser。 "底部空间约束" 实际上是一种取决于 UILabel 的约束,即如果 UILabel 变大,则其他视图应该移动。 - artooras
解决了 - 将UILabel的垂直压缩阻力优先级设置为1000(默认值为750)对我很有帮助。 - artooras
5个回答

17

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

enter image description here

由于我的视图嵌套在另一个视图中,且父视图的底部依赖于最低子视图的底部,在布局视图的过程中,没有高度约束的 UILabel 可能被挤压。可能在其他约束的优先级上进行调整会产生相同的结果,但我无法成功地实现。然而,上面的解决方案可以解决我的问题,这对我来说已足够好了。

希望这可以帮助到别人。


1

将标签从自身拖动 > 选择高度 > 将高度的常量设置为0并将等于(==)更改为大于或等于(>=)


这只是确保它足够高以容纳至少一行文本,但其余部分被截断了,即标签没有自动调整大小。 - artooras
请确保底部约束正确,因为这是正确的方法 :-) 编辑:尝试删除底部约束以进行测试。 - Rick van der Linde
好的,看起来你通过将hugging更改为1000来解决了它。这是因为添加了我的约束条件还是你自己添加的?无论哪种方式,请检查一下是否正确。 - Rick van der Linde
由于某种原因,底部约束(或它们的链)正在挤压标签 - 我猜是说“不要挤我”(1000)做到了 :) - artooras

1
在这个UIViewController中,AutoLayout不能满足您设置的所有constraints,因此它会关闭您UILabel上的这些约束条件,导致其处于压缩状态。您应该查看UIViewController中的其他constraints,并将height contraintpriority设置为更高的数字。

1

设置3个约束条件

1.与父视图的前导空间

2.与父视图的后继空间

3.与父视图的顶部空间

然后

@property (nonatomic, strong) IBOutlet UILabel *lbl;

- (void) viewDidLoad{
   [self.lbl sizeToFit];
}

1
我的约束条件就像你建议的那样,只是我还需要底部的约束来推动其他视图,如果标签变得太高。然而,通过将UILabel的垂直压缩阻力优先级设置为1000(默认750),我成功解决了我的问题。 - artooras

1

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

  • 距离父视图的前导空间
  • 距离父视图的后续空间
  • 与“项目”之间的垂直空间
  • 与“名称”之间的垂直空间
  • 高度

然后在控制器中添加一个IB输出线,将其设置为约束高度(假设为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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接