ios - UILabel textRectForBounds 不工作

标签 ios swift uilabel

我正在尝试计算长字符串“一二三四五六七八九十十一十一十二十三十四十五十六”的高度,因为它需要适合多行 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 为三行高,文本被截断,因为高度不够大:

enter image description here

我做错了什么?为什么我得不到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/

相关文章:

iOS Swift - 协议(protocol)发送委托(delegate)给错误的 TableViewController

swift - ARC 是否对无主引用进行计数?

ios - EKEvent 结束日期为零;无法在不使应用程序崩溃的情况下检查隐式解包可选

ios - 如何区分元数据中的艺术家姓名/轨道名称?

ios - 将UILabel的高度动画化为0

html - ios cordova - 使用垂直和水平滚动时的滚动问题

ios - 观察 UINavigationController navigationBar 显示/隐藏

ios - 将 GIF 附加到 TWTRComposer?

swift - Int、String 等在 Swift 中被认为是 'primitives' 吗?

ios - 如何以编程方式在 Swift 3 上复制 UILabel 样式