带自动换行的多行标签

Multiple Line Label with word wrapping

这看起来很直观,但我一直在尝试让文本停止离开屏幕 45 分钟。这是我的 viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    orgTitle.numberOfLines = 0
    orgTitle.lineBreakMode = .byWordWrapping
    orgTitle.frame.size.width = self.view.frame.size.width - 20
    orgTitle.sizeToFit()

    orgDesc.numberOfLines = 0
    orgDesc.lineBreakMode = .byWordWrapping
    orgDesc.frame.size.width = self.view.frame.size.width - 20
    orgDesc.sizeToFit()

    self.orgTitle.text = self.oTitle
    self.orgDesc.text = self.desc
    self.orgImage.image = self.image
}

我附上了问题的屏幕截图以及标签的设置。

我发现使用约束来设置布局比手动调整框架要容易得多...

但是,如果您出于某种原因想要手动设置标签的框架,我建议您做两件事:

  1. 就像@rmaddy 提到的那样,viewDidLoad 在视图控制器生命周期中还为时过早,框架是正确的。尝试覆盖 layoutSubviews 并将框架调整移动到该方法中。

  2. 对于 numberOfLines 设置为 0 的 UILabel,您还需要设置标签 preferredmaxlayoutwidth 属性 以帮助它确定需要多少行(如果使用约束则不需要)。

此外,如果您愿意定位 iOS9 及以上,UIStackView 是 UIKit 的一个很好的补充,可以帮助实现这种布局,其中子视图从可能增加的高度向下推multi-line 个标签。

下面是添加堆栈视图以容纳 2 个 UILabel 的一些屏幕截图,然后是将堆栈视图的左、上和右边缘固定到超级视图的约束:

通过故事板中定义的布局,您的 viewDidLoad 变得简单多了,只需设置标签的实际内容:

override func viewDidLoad() {
    super.viewDidLoad()

    self.orgTitle.text = self.oTitle
    self.orgDesc.text = self.desc
    self.orgImage.image = self.image
}