为什么视图没有及时更新?

时间:2021-06-17 17:29:37

标签: ios swift uikit

我正在尝试在单击时更改 UIImageView alpha 属性。但是,属性的​​更改是在所有代码行运行后完成的,我希望在单击完成后立即更改。为了简化代码,我更改了 sleep(2) 的所有代码行,因为它提供了相同的效果。

点击功能

@IBAction func click_btn() {
    imageView.alpha = 0.5
    sleep(2)
}

我曾尝试使用 DispatchQueueasync 方法,但结果是一样的。

这是结果,如您所见,当我单击按钮时,图像直到 2 秒睡眠时间过去后才会更改。单击后如何立即更改 alpha 属性?

enter image description here

1 个答案:

答案 0 :(得分:1)

这就是 iOS(和 Mac OS)上的事件循环的工作方式。 UI 更改在您运行代码时排队,然后在您返回并且应用程序访问事件循环时应用。你的拖延正在阻止改变的发生。如果你摆脱睡眠,它会按预期工作。

请注意,通常按钮会在“touch up inside”上触发,这意味着按钮在用户松开手指之前不会响应。如果需要,您可以将操作附加到触地事件。

你真正想要完成的是什么?

编辑:

像这样重写你的代码:

@IBAction func click_btn() {
    imageView.alpha = 0.5
    DispatchQueue.main.async() {
       //Code that takes 2 seconds to run
    }
}

这将导致您的函数立即返回,并且您的 alpha 更改发生。在下一次通过事件循环时,系统将在主队列中找到您的异步任务,将其取出并开始处理。请注意,在运行所需的 2 秒内,UI 将冻结。最好在后台队列上运行慢速代码,并且仅在“慢速位”完成后才更新 UI:

@IBAction func click_btn() {
    imageView.alpha = 0.5
    DispatchQueue. global().async {
       // Run the code that takes 2 seconds to run on a background thread
       DispatchQueue.main.async() {
           // Do your UI updates that have to run after the slow code finishes on the main thread.
    }
}
相关问题