我正在尝试在单击时更改 UIImageView alpha 属性。但是,属性的更改是在所有代码行运行后完成的,我希望在单击完成后立即更改。为了简化代码,我更改了 sleep(2)
的所有代码行,因为它提供了相同的效果。
点击功能
@IBAction func click_btn() {
imageView.alpha = 0.5
sleep(2)
}
我曾尝试使用 DispatchQueue
和 async
方法,但结果是一样的。
这是结果,如您所见,当我单击按钮时,图像直到 2 秒睡眠时间过去后才会更改。单击后如何立即更改 alpha 属性?
答案 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.
}
}