iOS Swift标签框架高度未正确更新

时间:2016-02-21 21:18:38

标签: ios swift label height frame

我有一个标签,每次用户点击一个按钮时,其文本都会改变。但是,即使Label内容已更改, Label.frame.height值也不会立即更新。更改Label的函数在多个位置调用,但高度仅在@IBAction块内部更新,其值滞后于一个单击周期。我的代码如下:

func changeLabelText() {
//Here I have an algorithm (not shown) that generates myMutableString 
Label.attributedText = myMutableString  //Label is updated.
}


@IBAction func changeLabelButton(sender: UIButton) {
print("1. Height = ", Label.frame.height) //Height updates here, but it's the old value.  
changeLabelText()  //Label is updated.
print("2. Height = ", Label.frame.height) //Returns same height as Line 1!!
}


override func viewDidLoad() {
super.viewDidLoad()
print("3. Height = ", Label.frame.height) //Initially, height is 21.0 when ViewController first loads.
changeLabelText() //Label is updated.
print("4. Height = ", Label.frame.height) //Returns height = 21.0, even though simulator shows Label updated!!
}

总之,这就是发生的事情:

  1. 用户点击按钮,标签显示新文字,但frame.height不变。

  2. 用户再次点击按钮,标签文字再次更改,frame.height此次更新,但更新为应在步骤1中使用的旧值。

  3. 我对Swift相对较新,对此有任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:5)

更改文本后立即调用这些方法

label.setNeedsLayout()
label.layoutIfNeeded()

这将为您提供正确的框架。

答案 1 :(得分:1)

当iOS为调整大小设置动画时,它实际上会首先更改显示图层,然后更改对象的实际帧(或大致沿着这些线)。

尝试查询Label.layer.frame.height

尝试拨打Label.sizeToFit()以强制重绘,然后再进行第二次print来电。

或者,您可以等几个小时,直到iOS自己完成:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10000000), dispatch_get_main_queue(), {
    print("2. Height = ", self.Label.frame.height) //Returns the correct height
})