使 UILabel 以不断变化的内容和 AutoLayout 为中心

Posted

技术标签:

【中文标题】使 UILabel 以不断变化的内容和 AutoLayout 为中心【英文标题】:Keeping a UILabel centered with changing contents and AutoLayout 【发布时间】:2013-03-15 23:28:52 【问题描述】:

我有 2 个视图。一个 MapKitView 和一个 UILabel。自动布局已开启。

我希望 MKView 占据整个屏幕(这似乎工作正常)并且 UILabel 保持与屏幕底部的自动距离但水平居中。 UILabel 内容以编程方式更改,之后我调用sizeToFit

在 UILabel 上调用 sizeToFit 后,它不再居中 - 宽度似乎仅从右侧(后缘)调整,保持左侧处于恒定位置。

我的理解是,我应该能够通过在 IB 中设置正确的约束来实现我想要的?

我对标签应用的约束是:

Height Equals: 32
Width Equals: 166
Bottom Space to: Superview Equals: Default
Align Center X to: Map View

只有最后一个,“对齐中心 X”是用户约束 - 其余由 IB 提供。

我尝试了很多东西,但都没有得到太多理解(大概是我的问题!)。

我已在标签上致电setTranslatesAutoresizingMaskIntoConstraints: NO。 我已经设置了标签的autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin。我尝试将preferredMaxLayoutWidth 设置为随机值。在标签上调用needsUpdateConstraints。我尝试在viewDidLayoutSubviews 中拨打sizeToFit 的电话。

我得出的结论是,我需要更多地了解我应该如何处理这个问题。 sizeToFit 不是自动布局打开时要调用的东西吗?在调用sizeToFit 后,我是否需要以某种方式刺激自动布局?我注意到旋转模拟器似乎使标签居中,所以刺激听起来很可能?

我重新阅读了Apple Auto Layout guide,但恐怕我仍然不确定我做错了什么,并且建议的调试技巧(visualizeConstraints 等)似乎不适用于 ios

感谢您提供任何线索。

【问题讨论】:

【参考方案1】:

我关于必须刺激的想法似乎是正确的。致电sizeToFit 后,我需要致电[label.superview setNeedsLayout]。虽然这可行,但我不确定为什么我需要手动执行此操作,而不是在尺寸更改时将布局标记为脏的标签。

【讨论】:

以上是关于使 UILabel 以不断变化的内容和 AutoLayout 为中心的主要内容,如果未能解决你的问题,请参考以下文章

带有 UILabel 内容的 UITableViewCell 在滚动时发生变化

UITableViewCell 中的 UILabel 约束横向变化

当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?

在iOS中使用autolayout调整内容大小的UILabel

如何设置两个 UILabel 压缩优先级以使一个垂直推动另一个?

如何使动态高度 UILabel 将其他元素推开?