我遇到了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 单词并截断最后的单词,如操作区预览功能所示:
答案 0 :(得分:0)
一个明显的问题是valueString
和textString
是两个不同的字符串。因此,没有理由相信您放入标签的字符串与您正在测量的字符串相同。
您在此处使用valueString
:
let attributedText = NSAttributedString.init(
string:valueString, // ...
但你在这里使用dataString
:
height:textString.boundingRectWithSize(
此外,不要尝试将标签属性与属性文本结合使用。这可能会导致各种问题。 dataValue
标签应包含否font
。您不应该获取此font
值。使用属性字符串执行所有操作。你不应该构建两种不同的风格词典;你应该分配和测量完全相同的属性字符串。
换句话说,无论是否有属性,都不要衡量valueString
或textString
。衡量attributedString
。
最后,确保标签与测量期间使用的宽度相同。你在说
CGSizeMake(CGFloat(kMaxWidth) // ...
但没有证据表明标签本身会有这样的宽度。