UILabel textRectForBounds不起作用

时间:2016-12-08 17:24:44

标签: 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的预期结果?

对于它的价值,如果我称之为这种方法,我会得到相同的结果:

let rect = (label.text as NSString!).boundingRectWithSize(
   CGSize(width: label.bounds.width, height: 100000000.0), 
   options: .UsesLineFragmentOrigin, 
   attributes: [NSFontAttributeName: font], 
   context: NSStringDrawingContext())

编辑:问题最终导致视图尚未布局,导致UILabel的宽度在上面的计算中不正确。有关详细信息,请参阅最后评论

1 个答案:

答案 0 :(得分:1)

有时,当视图是视图层次结构中的子视图时,最好在 viewWillLayoutSubviews()中的超级视图中设置高度/宽度(使用帧或自动布局约束)(或 viewDidLayoutSubviews())。 在执行这些操作之前,视图不具备所需的所有布局数据。