这听起来很简单,但我一直没弄明白。
上下文:VC 告诉 View 为自身设置动画,然后 VC 等待动画完成。
我想过做这样的事情:
在 View Controller 中:
loadingView.animate()
在 LoadingView(UIView 子类)中:
animate() -> Bool {
UIView.animate(withDuration: 1.0, animations: {
self.imageViewCenterYConstraint.constant -= 20
self.layoutIfNeeded()
}, completion {
return true // This line obviously doesn't work.
})
}
我不想将其余代码包含在完成 block 中。其余代码在 VC 中。
我怀疑所有这些都应该通过添加到动画函数中的额外完成处理程序来完成。
PS:以防万一您知道更好的解决方案/最佳实践,这里有更多上下文:我显示加载动画并在从网络检索数据后将其删除。我总是想等动画完成再删除,即使网络数据已经下载了。不想在一半时停止动画。
最佳答案
一旦异步任务完成,您就无法从函数返回。 (好吧,这可能是可能的,但这是一个非常糟糕的想法。您必须阻塞主线程等待异步函数完成,这会卡住您的 UI 并导致系统跳板如果花费的时间太长,将终止您的应用程序。)
您需要编写函数来获取完成 block 并在动画完成后调用它。像这样:
animate( completion: (Bool) -> Void) {
UIView.animate(withDuration: 1.0, animations: {
self.imageViewCenterYConstraint.constant -= 20
self.layoutIfNeeded()
}, completion {
completion(true)
})
}
(我认为这是对的,但我仍然没有完美的闭包语法,因此可能需要调整。)
关于ios - 在动画完成后需要返回的函数中嵌入 UIView 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836829/