iOS swift 视图中的多行 UILabel

iOS swift multi-line UILabel in a view

我想在 Interface Builder 中完成下图中显示的内容。基本上是两个标签——一个多行标签和一个注释——在一个视图中,并且该视图在页面上水平居中。所以要清楚,我不能对视图施加宽度限制,否则居中将无法正常工作。

当标签不在视图中时,我可以获得带有实际小时数的多行标签,但是当我将它放在视图中并设置顶部、左侧和右侧约束时 - 标签恢复为单线。

下面是视图中标签的约束和属性,以及更新框架时 IB 所做操作的图片。任何建议将不胜感激。

仅包含工作时间的标签有以下限制:

这是我更新帧后的样子

您的多行标签或外部视图需要以某种方式限制其宽度,否则标签会将其宽度扩展到它需要的任何宽度以容纳一行中的文本。如果该行足够长,文本将 运行 超出视图的边缘,这似乎是您上一张图片中发生的情况。

编辑后:

要在小时列表较短时使视图居中,但在小时列表较长时仍允许视图变宽,请为父视图的外部视图提供 <= 宽度约束。在 IB select 中,您的视图然后是超级视图,然后选择 "equal widths",然后将其编辑为 <=。如果列表很短,默认的拥抱优先级将使外部视图保持较小,但如果列表增长到足以进入多行,您仍然有宽度约束来强制它这样做。

我发现在 IB 中添加此 <= 约束在旋转时无法正常工作。如果标签是纵向的多行,因此 labelsView(包含 2 个标签的视图)被扩展到屏幕的整个宽度,旋转时 labelsView 保持相同的宽度,而不是调整到新的大小。我认为这是系统中的错误。幸运的是,在代码中添加相同的约束,效果很好。

override func viewDidLoad() {
    super.viewDidLoad()
    view.addConstraint(NSLayoutConstraint(item: labelsView, attribute: .Width, relatedBy: .LessThanOrEqual, toItem: self.view, attribute: .Width, multiplier: 1, constant: 0))
}