ios - 设置为自动换行时如何获取 UILabel 文本的实际宽度

标签 ios swift uilabel

我有以下代码来设置 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 时一样,然后实际调整自身的大小以刚好适合包裹的文本。这是一个图表来说明: enter image description here

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

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

编辑:

虽然约束可能是通常的选择,但在我的例子中,我不认为这是因为我正在根据此标签的结果大小来调整我的 super View 的大小。

最佳答案

好吧,我刚刚弄明白了。 @rmaddy 在上面的问题评论中是正确的。在问这个问题之前,我已经看到了 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)

关于ios - 设置为自动换行时如何获取 UILabel 文本的实际宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39521530/

相关文章:

objective-c - libz.dylib libsqlite3.dylib 不在 Xcode 7 中,解析不保存数据

swift - Admob 横幅不粘在 uitableview swift 的底部

ios - 如何检测和使UILabel中的超链接/提及/标签可点击?

ios - 如何将不同字体的 UILabel 中的文本居中

ios - 如何使 UITextView 布局文本与 UILabel 相同?

ios - 将导航标题设置为 2 个字符串

ios - 未设置transitionViewForCurrentTransition,演示 Controller 在演示过程中被关闭

ios - 如何摆脱警告 "Result of call ' resignFirstResponder( )' is unused"?

javascript - 地理位置不适用于 iOS 和 Meteor

ios - 在应用程序中使用多个 Storyboard的最佳方式