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

Posted

技术标签:

【中文标题】iOS Swift标签框高度未正确更新【英文标题】:iOS Swift Label Frame Height Not Updating Correctly 【发布时间】:2016-06-03 04:53:27 【问题描述】:

我有一个标签,每次用户单击按钮时,它的文本都会发生变化。但是,即使标签内容发生了变化,Label.frame.height 值也不会立即更新。更改标签的函数在多个地方调用,但高度仅在 @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!!

总而言之,这就是正在发生的事情:

    用户点击Button,Label显示新文本,但frame.height不变。

    用户再次单击 Button,Label 文本再次更改,frame.height 这次更新,但更新为在步骤 1 中应该具有的旧值。

我对 Swift 比较陌生,如果能提供任何帮助,我们将不胜感激。

【问题讨论】:

【参考方案1】:

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

label.setNeedsLayout()
label.layoutIfNeeded()

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

【讨论】:

.layoutIfNeeded() 似乎解决了我的问题。谢谢一百万!【参考方案2】:

ios 动画调整大小时,它实际上首先更改显示层,然后是对象的实际框架(或大致沿着这些线)。

尝试查询Label.layer.frame.height

在第二个print 调用之前,尝试调用Label.sizeToFit() 强制重绘。

或者,您可以等待几个滴答声,直到 iOS 自己完成:

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

【讨论】:

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

以上是关于iOS Swift标签框高度未正确更新的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 新更新提供可选问题

在滚动视图中更改 UIView 而 / 更新滚动视图高度 - Swift 3 / Xcode 8

重用 tableviewcell 中的约束和高度未更新

为什么只更新了第一个单元格中的图像,而未更新uicollectionview中的其余单元格。 ios swift

UITableView 中的单元格在 iOS 中选择之前不会更新(swift)

自定义 tableviewcell 动态高度未根据约束更新(以编程方式自动布局)