我正在尝试计算长字符串“一二三四五六七八九十十一十一十二十三十四十五十六”的高度,因为它需要适合多行 UILabel。问题是我从这个方法得到了不正确的结果,即使我等待在 layoutSubviews()
let rect = label.textRectForBounds(
CGRect(x: 0,y: 0, width: label.bounds.width, height: 10000000.0),
limitedToNumberOfLines: 6)
当我在这一行之后设置断点时,我得到:
(lldb) po rect
▿ CGRect
▿ origin : CGPoint
- x : 0.0
- y : 0.0 { ... }
▿ size : CGSize
- width : 374.0
- height : 36.0
36.0 的高度太短了——代表单行,我已经将标签高度设置为 65.0,以便显示两行。显示时,UILabel 为三行高,文本被截断,因为高度不够大:
我做错了什么?为什么我得不到36.0*3=108.0高度的预期结果?
就其值(value)而言,如果调用此方法,我会得到相同的结果:
let rect = (label.text as NSString!).boundingRectWithSize(
CGSize(width: label.bounds.width, height: 100000000.0),
options: .UsesLineFragmentOrigin,
attributes: [NSFontAttributeName: font],
context: NSStringDrawingContext())
编辑: 问题确实是 View 尚未布局,导致上面计算中 UILabel 的宽度不正确。详情见最后一条评论。
最佳答案
有时,当 View 是 View 层次结构中的 subview 时,最好在 viewWillLayoutSubviews() (或 viewDidLayoutSubviews()). 在执行这些之前, View 没有它们需要的所有布局数据。
关于ios - UILabel textRectForBounds 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41045296/