AutoLayout 将 UILabel 高度设置为零

Posted

技术标签:

【中文标题】AutoLayout 将 UILabel 高度设置为零【英文标题】:AutoLayout setting UILabel height to zero 【发布时间】:2015-08-28 13:15:58 【问题描述】:

我有一个UILabel 用于其他视图中的项目描述,所有这些都使用 Interface Builder 中的约束进行布局 - 您可以在下图中看到所有相关约束。行数也设置为0

我没有设置高度限制,因为我希望 UILabel 根据它包含的文本调整大小。相反,发生的事情就在

[self.view layoutIfNeeded];

被调用,UILabel 的高度被设置为0。即使我没有将其他文本设置为UILabel,它在Interface Builder 中设置了默认值Item description

上面的item标题标签也是这样设置的,但是那个并没有被压缩成0,所以我有点糊涂了。

有人遇到过这种行为吗?

【问题讨论】:

控制台中是否有任何 AutoLayout 约束错误? AutoLayout 由于冲突而放弃了一些约束? 我知道你不想硬核到那个 UILabel 的高度,但是如果你这样做了会发生什么?您在控制台中是否遇到任何 AutoLayout 约束冲突? 我认为您需要删除“顶部空间到”或“底部空间到”。否则高度是由这些约束设置的?不过我可能错了…… 嗨亚瑟。 bottom space to 约束实际上是一个依赖于 UILabel 的约束,即如果UILabel 变大,另一个视图应该移动 解决了 - 将 UILabel 的垂直压缩阻力优先级设置为 1000(默认为 750)似乎对我有用。 【参考方案1】:

我设法通过在 Interface Builder 中将UILabelvertical compression resistance priority 设置为1000(默认750)来解决它。

由于我的视图嵌入在另一个视图中,并且父视图的底部依赖于最低子视图的底部,我只是推测没有高度限制的UILabel在布局的过程中被挤压意见。可能在链的某个地方使用其他约束的优先级会产生相同的结果,但我无法成功地做到这一点。但是,上面的解决方案有效,这对我来说已经足够了。

希望这对某人有所帮助。

【讨论】:

【参考方案2】:

设置 3 约束

1.领先空间到superview

2.到superview的尾随空间

3.top space to superview

然后

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

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

【讨论】:

我的约束就像你建议的那样,除了如果标签变得太高我还需要底部的约束来下推其他视图。但是,我设法通过将 UILabel 的垂直压缩阻力优先级设置为 1000(默认为 750)来解决我的问题。【参考方案3】:

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

【讨论】:

这只是确保它足够高以容纳至少一行文本,但其余部分被截断,即标签没有自动调整大小 确保底部约束是正确的,因为这是这样做的方法:-) 编辑:通过删除底部约束来测试它。 好的,看来您通过将拥抱更改为 1000 来修复它。这是由于添加了我的约束还是您添加了一些东西?无论哪种方式,请检查某些内容作为正确答案。 出于某种原因,底部约束(或它们的链)正在挤压标签 - 我猜是说“不要挤压我”(1000)做到了:)【参考方案4】:

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

引领空间到superview 超级视图的尾随空间 “项目”的垂直空间 “名称”的垂直空格 身高

然后在你的控制器中添加一个 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;

【讨论】:

【参考方案5】:

这个UIViewController中的AutoLayout不能满足你设置的所有constraints,因此它会关闭你UILabel上的那些,导致压缩状态。您应该查看UIViewController 中的另一个constraints,并将height contraintpriority 设置为更大的数字。

【讨论】:

以上是关于AutoLayout 将 UILabel 高度设置为零的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout动态调整UILabel高度和宽度

如何使用 AutoLayout 使我的 UIImage 的高度与我的 UILabel 的固有高度相同?

如何使用 AutoLayout 配置视图宽度固定宽度和可变高度

IOS - UIView中使用AutoLayout的UILabel动态高度

AutoLayout 在地图标注中动态调整 UILabel 高度和宽度?

markdown UIScrollView中的动态UILabel高度与Autolayout