英文:
How to make UIView.animate function to be sync?
问题
我在按钮点击时在我的ViewController中调用animateScan()
作为同步函数。因此,在这个函数之后,我调用另一个函数来呈现另一个ViewController。在animateScan()
中,我有一个2.5秒的动画,但根据我理解,UIView.animate是异步函数,所以当我调用它时,我只是设置了动画,而animateScan()
在不等待这2.5秒的情况下结束了。所以我的问题是,我是否可以以某种方式强制animateScan()
函数等待这2.5秒的动画?我能使UIView.animate
成为同步的吗?
P.S. 我不想在UIView.animate
中使用完成闭包。
英文:
So I have some function with animation:
func animateScan() {
topConstraint.constant = frame.height
UIView.animate(withDuration: 2.5) {
self.superview?.layoutIfNeeded()
}
}
I call animateScan()
in my ViewController on button tap as a sync functions. So after this function I call another function to present another ViewController. In animateScan()
I have animation with 2.5 duration, but UIView.animate, as I understand Is async function, so when I call it I just setup animation, and animateScan()
finishes without waiting this 2.5sec.
So my question is, can I somehow force animateScan()
function to wait this 2.5 animation? Can I make UIVIew.animate
to be synchronous?
P.S. I don't want to use completion closure in UIview.animate
.
答案1
得分: 0
你不应该将动画设为同步,因为等待其完成会暂停主线程,这是一个非常糟糕的想法。你应该使用完成处理程序。这就是它们存在的原因。
英文:
You should not make the animation synchronous as waiting for its completion would suspend the main thread and that is a very bad idea. You should use the completion handlers. That's why they exist.
答案2
得分: 0
你可以将你的方法包装成一个 async
方法:
func animateScan() async {
await withCheckedContinuation { continuation in
// ... 其他代码 ...
UIView.animate(withDuration: 2.5) {
// ... 其他代码 ...
} completion: { _ in
continuation.resume()
}
}
}
现在,当你在一个 async
上下文中使用 await
调用 animateScan()
时,你的代码会在等待完成之前神奇地暂停并恢复。
英文:
You can wrap your method up as an async
method:
func animateScan() async {
await withCheckedContinuation { continuation in
// ... whatever ...
UIView.animate(withDuration: 2.5) {
// ... whatever ...
} completion: { _ in
continuation.resume()
}
}
}
Now when you call animateScan()
by saying await
in an async
context, your code will magically pause and wait for completion before resuming.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论