boundingRectWithSize为多行标签返回错误的高度值

时间:2016-02-10 16:43:52

标签: ios swift uilabel

我遇到了boundingRectWithSize和使用Swift语言的多行UILabel的奇怪问题。我目前正在Xcode游乐场工作,所以我可以实时查看UI的结果和更新。

我想要做的是根据它的内容动态计算给定的UILabel高度,我知道这已经在其他StackOverflow问题中进行了讨论,但这对我来说似乎太奇怪了。

多行标签以NSAttributedString形式显示此文字。 Text是一个简单的Lorem ipsum占位符:

  

Lorem ipsum dolor坐下来,精神上的精神。 Donec diam lectus。 Sed坐在amet ipsum mauris。 Maecenas认为ligula ac quam viverra nec consectetur ante hendrerit。 Donec et mollis dolor。

这是UILabel的代码:

let valueString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor."

var dataValue = UILabel()
dataValue.numberOfLines = 0
dataValue.lineBreakMode = .ByWordWrapping

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .Justified
paragraphStyle.lineBreakMode = .ByWordWrapping
paragraphStyle.firstLineHeadIndent = 0.1

let attributedText = NSAttributedString.init(
    string:valueString,
    attributes:[NSParagraphStyleAttributeName:paragraphStyle, NSFontAttributeName:dataValue.font])

let textString = dataValue.text! as NSString

dataValue.attributedText = attributedText

dataValue.frame = CGRect(
                x:CGFloat(kMargin),
                y:dataType.frame.origin.y + CGFloat(kLabelHeight),
                width:CGFloat((maxLabelWidth) - kMargin * 2),
                height:textString.boundingRectWithSize(
                    CGSizeMake(CGFloat(kMaxWidth), CGFloat.max),
                    options:[.UsesLineFragmentOrigin, .UsesFontLeading],
                    attributes:[NSParagraphStyleAttributeName:paragraphStyle, NSFontAttributeName:dataValue.font],
                    context:nil).size.height)

问题在于,UILabel只显示3行文本,停留在文本的 mauris 单词并截断最后的单词,如操作区预览功能所示:

enter image description here

1 个答案:

答案 0 :(得分:0)

一个明显的问题是valueStringtextString是两个不同的字符串。因此,没有理由相信您放入标签的字符串与您正在测量的字符串相同。

您在此处使用valueString

let attributedText = NSAttributedString.init(
string:valueString, // ...

但你在这里使用dataString

height:textString.boundingRectWithSize(

此外,不要尝试将标签属性与属性文本结合使用。这可能会导致各种问题。 dataValue标签应包含font 。您不应该获取此font值。使用属性字符串执行所有操作。你不应该构建两种不同的风格词典;你应该分配和测量完全相同的属性字符串

换句话说,无论是否有属性,都不要衡量valueStringtextString。衡量attributedString

最后,确保标签与测量期间使用的宽度相同。你在说

CGSizeMake(CGFloat(kMaxWidth) // ...

但没有证据表明标签本身会有这样的宽度。