UILabel swift中多行字符串的边界矩形

Posted

技术标签:

【中文标题】UILabel swift中多行字符串的边界矩形【英文标题】:Bounding rect of multiline string in UILabel swift 【发布时间】:2016-12-09 04:17:42 【问题描述】:

我已经尝试了几个小时在我拥有的 UILabel 中找到字符串的boundingRect,但似乎没有任何效果。

据我了解,boundingRect 返回标签中实际文本的大小,而不是标签的大小或类似的东西。这是真的,对吧?

我有一个名为messageLabelUILabel,其中包含一些可以换行到无限行数的文本。

我现在的代码是这样的:

let labelRect = (message as NSString).boundingRect(with: messageLabel.frame.size, 
    options: .usesLineFragmentOrigin, 
    attributes: [NSFontAttributeName : messageLabel.font], 
    context: nil)

不幸的是,这会为我的文本返回完全错误的尺寸。

在多行 UILabel 中返​​回文本尺寸的正确方法是什么?

【问题讨论】:

您是要计算已在标签中设置且标签已调整大小以适合字符串的字符串的大小需求,还是要计算基于字符串所需的高度在字体和所需宽度上? 您应该使用关键信息更新您的问题,例如messageLabel.frame.sizelabelRect 的值。 @rmaddy,我认为labelRect 没有设定值。在问题中,OP 将值分配给labelRect。更合适的名称是textRect 【参考方案1】:

用途:

let sizeToFit = CGSize(width: messageLabel.frame.size.width,
                       height: CGFloat.greatestFiniteMagnitude)
let textSize = messageLabel.sizeThatFits(sizeToFit)

无论如何,你做的方式应该也可以工作(你可以在操场上看到两个函数返回相同的大小):

我在操场上添加了一个示例视图,所以你可以看到,标签有黑色边框,文本适合里面,并且比标签小。大小是使用 sizeToFitboundingRect 方法正确计算的(但 boundingRect 返回的不是四舍五入的值)。我已经使用这个计算出来的大小在文本下创建了一个绿色背景视图,它非常适合它。

【讨论】:

如果width 等于CGFloat.greatestFiniteMagnitude 作为高度,它会计算单行文本的大小(因为它有足够的空间来容纳单行文本) 但关键是 OP 的文本已经适合标签,但他/她想获得文本实际占用的区域的大小——这可能小于标签的大小 这就是将宽度设置为标签宽度的关键,因此它将计算框架中的文本大小,与标签中的文本完全相同。相反,它会计算文本的大小,但布局不同。 @Dopapp 我已经用新的替换了操场截图,所以你可以看到它正在工作 如果不是全宽,您可以在这里看到它也适合文本:i.imgur.com/K7R13ID.png 和 i.imgur.com/g8Q07Hg.png【参考方案2】:

我觉得你需要试试这个

    let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: _screenSize.width - 30, height: 5))
    messageLabel.font = self.txtDescription.font
    messageLabel.numberOfLines = 0
    messageLabel.text = "Your Massage"
    messageLabel.numberOfLines = 0
    messageLabel.sizeToFit()
    print(messageLabel.frame.size.height)

删除所有代码试试这个希望它会起作用

【讨论】:

文本已经适合标签。我想要实际文本的大小,它 等于标签的大小。 告诉我你需要实现什么功能? 我有一个视图,它用作 UILabel 的背景视图,我想调整它的大小以尽可能接近文本而不是标签。

以上是关于UILabel swift中多行字符串的边界矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?

调整字体大小以适应边界矩形?

具有大小类的自调整 UITableViewCells 中的多行 UILabel - iOS 8 和 Swift

swift UILabel中的多行文本(来自http://stackoverflow.com/a/990244/1135737)

swift UILabel多行显示时 计算UILable的高度(可用于UILable高度自适应)

目标C:编写一个函数来返回UILabel中最后一个字符的位置?