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 中将UILabel
的vertical 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 contraint
的priority
设置为更大的数字。
【讨论】:
以上是关于AutoLayout 将 UILabel 高度设置为零的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AutoLayout 使我的 UIImage 的高度与我的 UILabel 的固有高度相同?
如何使用 AutoLayout 配置视图宽度固定宽度和可变高度
IOS - UIView中使用AutoLayout的UILabel动态高度