iOS Swift标签帧高度未正确更新

iOS Swift标签帧高度未正确更新,ios,swift,label,height,frame,Ios,Swift,Label,Height,Frame,我有一个标签,用户每次单击按钮时,其文本都会发生变化。但是,即使标签内容已更改,Label.frame.height值也不会立即更新。更改标签的函数在多个位置调用,但高度仅在@iAction块内部更新,其值滞后于一次单击周期。我的代码如下: func changeLabelText() { //Here I have an algorithm (not shown) that generates myMutableString Label.attributedText = myMutableS

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

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!!
}
总之,发生了以下情况:

  • 用户单击按钮,标签显示新文本,但frame.height保持不变

  • 用户再次单击按钮,标签文本再次更改,frame.height这次更新,但更新为第1步中应有的旧值


  • 我对Swift还比较陌生,非常感谢您的帮助。

    当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
    })
    

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

    label.setNeedsLayout()
    label.layoutIfNeeded()
    

    这将为您提供正确的框架

    谢谢你。但是我得到的layer.frame.height值始终与frame.height相同。我真正想做的就是得到标签中文本的高度。但是.frame.height返回旧值。请尝试在
    changeLabelText()
    函数末尾调用
    Label.sizeToFit()
    函数,以在第二次
    print
    调用之前强制重新绘制边界。基本上,发生的情况是,iOS正在等待,直到有时间调整标签的大小。因为它需要加快速度并做其他更重要的事情,比如调用第二个
    print
    函数。如果你告诉它继续和调整大小很重要,它会先这样做。pfj。。。长话短说,sizeToFit()工作得几乎完美——除了(出于某种原因)第一次标签更新导致高度被调整以适应每个横向方向的文本(尽管我是纵向的)。下面的label.layoutIfNeeded()方法似乎已经修复了所有问题。非常感谢您的帮助,我会把这个漂亮的“sizeToFit”方法放在我的后口袋里,以备将来使用。layoutIfNeeded()似乎已经解决了我的问题。万分感谢!