【问题标题】:How to get actual width of UILabel text when set to word wrap设置为自动换行时如何获取 UILabel 文本的实际宽度
【发布时间】:2016-09-15 22:55:31
【问题描述】:

我有以下代码来设置 UILabel:

let label = UILabel()
label.numberOfLines = 0
label.textAlignment = .center
label.lineBreakMode = .byWordWrapping
label.preferredMaxLayoutWidth = maxWidth

label.text = "String that is long enough to cause word wrap."

label.sizeToFit()
self.view.addSubview(label)

我需要的结果是标签将文本包裹起来,就像它到达label.preferredMaxLayoutWidth 时一样,然后实际上将其自身调整到足够宽以适合包裹的文本。这是一个图表来说明:

红色框的宽度等于label.preferredMaxLayoutWidth,这是我使用上面的代码得到的实际尺寸。 黑盒子是我想要的大小。 无论标签的大小是红色还是黑色,自动换行都是一样的。

那么,如何在保持当前自动换行的同时将标签的大小调整为尽可能小的宽度?

编辑:

虽然约束可能是通常的选择,但就我而言,我不认为这是因为我根据此标签的结果大小调整我的超级视图。

【问题讨论】:

  • 您在寻找flush space吗? (参见添加刷新空间部分)
  • 使用NSString boundingRectWithSize:options:attributes:context:(或String的Swift等效项)来获得所需的字符串大小。
  • @paulvs 不,我认为这不是同一回事。
  • 我通常通过在我的标签中添加前导和尾随约束来解决这个问题,这样如果它太长就会换行
  • @rmaddy 我认为你在正确的轨道上。我在 obj-c 线程中也看到了这一点,但由于某种原因很难找到 Swift 等价物。我正在进一步调查。

标签: ios swift uilabel


【解决方案1】:

好的,我刚刚想通了。 @rmaddy 在上面问题的 cmets 中是正确的。我在问这个问题之前见过boundingRectWithSize:options:attributes:context:,但是在迅速解决这个问题时遇到了问题。但现在我明白了。这是我更新的代码:

让标签 = UILabel()

    let text = "String that is long enough to cause word wrap."
    let rect = text.boundingRect(with: CGSize(width: maxDesiredWidth, height:CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: nil, context: nil)

    label.numberOfLines = 0
    label.textAlignment = .center
    label.lineBreakMode = .byWordWrapping
    label.frame = rect

    label.text = text

    label.sizeToFit()
    self.view.addSubview(label)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2016-10-15
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多