我有多个标签,我想让它们一个接一个地动画化。 因此,我构建了一个完成处理程序,它应该在前一个任务完成后执行下一个任务。 (第一个任务->第二个任务->第三个任务->最后的第四个任务。)
但是由于某种原因,所有的动画都是同时执行的。 我做错了什么?
func firstTask(completion: (_ success: Bool) -> Void) {
UIView.transition(with: labelOne,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.labelOne.text = arrayOne[RandomWordGenOne]
}, completion: nil)
completion(true)
}
// two more tasks in between just like the firstTask func …
func fourthTask() {
UIView.transition(with: labelFour,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.labelFour.text = arrayFour[RandomWordGenFour]
}, completion: nil)
}
完成处理程序:
firstTask { (success) -> Void in
if success {
secondTask { (success2) -> Void in
if success2 {
thirdTask { (success3) -> Void in
if success3 {
fourthTask()
}
}
}
}
}
}
当动画完成时,您需要执行您的完成块,这发生在动画的完成块上
func firstTask(completion: @escaping ((_ success: Bool) -> Void)) {
UIView.transition(with: randomOne, duration: 1, options: .transitionCrossDissolve, animations: {
self?.randomOne.text = location[RandomWordGenOne]
}) { (finished) in
completion(true)
}
}
这是因为您没有在完成处理程序中编写complety
块。 您需要使用转义闭包来实现这一点。 下面是更新后的代码。
func firstTask(completion: @escaping ((_ success: Bool) -> Void)) {
// The animation. The others are all basically the same.
UIView.transition(with: randomOne,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.randomOne.text = location[RandomWordGenOne]
}, completion: completion)
//self.randomOne.animate(newText: location[RandomWordGenOne], characterDelay: 0.05)
}
func secondTask(completion: @escaping ((_ success: Bool) -> Void)) {
UIView.transition(with: dash,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.dash.text = " – "
}, completion: completion)
//self.dash.animate(newText: " – ", characterDelay: 0.05)
}
func thirdTask(completion: @escaping ((_ success: Bool) -> Void)) {
UIView.transition(with: randomTwo,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.randomTwo.text = time[RandomWordGenTwo]
}, completion: completion)
//self.randomTwo.animate(newText: time[RandomWordGenTwo], characterDelay: 0.05)
}
func fourthTask() {
UIView.transition(with: randomThree,
duration: 1,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.randomThree.text = text[RandomWordGenThree]
}, completion: nil)
//self.randomThree.animate(newText: text[RandomWordGenThree], characterDelay: 0.05)
}
然后更新方法调用,如下所示
firstTask { (success) in
if success {
secondTask { (success2) in
if success2 {
thirdTask { (success3) in
if success3 {
fourthTask()
}
}
}
}
}
}
您必须在函数签名中添加@escaping。 下面是一个例子
func getSumOf(array:[Int], handler: @escaping ((Int)->Void)) {
// add your code here
}