【问题标题】:Swift 3 UILabel, how to word wrap after changing textSwift 3 UILabel,更改文本后如何自动换行
【发布时间】:2026-01-11 20:25:02
【问题描述】:

我有一个以编程方式创建的 UILabel,并希望在创建后动态设置 text 属性。我可以在初始化期间自动换行,但随后不能。更改标题标签文本后,无论我将行数设置为 2 还是 0 以及是否自动换行,它都会保留一行。更改标题后,我希望它占据 2 行,并且文本很容易发生这种情况,但事实并非如此。

let titleLabel: UILabel = {
    let label = UILabel()
    label.textAlignment = .center
    label.translatesAutoresizingMaskIntoConstraints = false
    label.backgroundColor = .clear
    label.layer.masksToBounds = true
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.textColor = .white
    return label
}()

var titleLabelText: String? {
    didSet {
        titleLabel.text = titleLabelText
        titleLabel.layoutIfNeeded()
    }
}

然后……

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

        titleLabelText = "some string which needs word wrapping"

}

    titleLabel.heightAnchor.constraint(equalToConstant: 40.0).isActive = true
    titleLabel.widthAnchor.constraint(equalToConstant: screenWidth - 90).isActive = true

字体大小为UIFont(name: "Muli", size: 12) 这是我在viewDidLoad() 中加载标签的方式,但 label.text 应用于viewDidAppear()

let headerStackView: UIStackView = {
  let headerArray = [welcomeLabel]
  let stackView = UIStackView(arrangedSubviews: headerArray)

【问题讨论】:

  • translatesAutoresizingMaskIntoConstraints 如果您不使用自动布局约束,则应为 true,如果是,请尝试更新 didSet 中的约束,即 view.setNeedsUpdateConstraints()
  • label.translatesAutoresizingMaskIntoConstraints = false 是必需的,因为我在没有故事板的情况下使用代码进行所有操作。您的建议导致我的锚点无效和空白视图。
  • 你能解释一下你是如何在视图中添加标签的吗,在上面的代码中,不清楚你是创建约束还是以编程方式添加框架
  • 如果以编程方式添加约束,请在 viewDidLayoutSubViews() 或 viewDidAppear() 中设置 titleLabelText
  • 我不使用框架,didSet 是类级别的。

标签: ios swift3 uilabel


【解决方案1】:

当您将标签设置为显示多行时。请记住,您的标签必须有足够的高度来容纳您的文本以显示多行。

尝试增加标签的高度,检查宽度是否合适,然后检查您的代码。

【讨论】:

  • 我这样做了,但没有帮助。标签大小应该足够,我已经编辑了我的问题以显示标签大小。
  • @markhorrocks 你能在控制台中记录标签大小和字体大小并在这里评论吗?
  • 文本大小 (56.712890625, 17.689453125) 标签大小 (345.0, 74.0),在 ViewDidLoad() 中调用
  • @markhorrocks 文本大小(56.712890625、17.689453125)是您的字体大小吗?您使用了哪种字体样式?还请告诉我您是如何将此标签添加到您的视图中的?
  • 不仅要有足够的高度,还要限制它的宽度。
【解决方案2】:

如果您的文本增加减小字体大小,它会自动在您的标签中显示完整的文本。

并将标签行间距设置为 0 并允许自动换行属性为 true

【讨论】:

    【解决方案3】:

    选择您的标签并尝试这个

    【讨论】:

      【解决方案4】:

      AFAIK 您需要将其添加为属性文本,然后使用您的字符串和属性创建一个 NSAttributedString。

          let paragraphStyleWithWordWrapping = NSMutableParagraphStyle()
          paragraphStyleWithWordWrapping.lineBreakMode = .byWordWrapping
          let attributedString = NSAttributedString(myString, [NSParagraphStyleAttributeName: paragraphStyleWithWordWrapping])
           label.attributedText = attributedString
      

      【讨论】: