Skip to content

4.1_使用completion闭包处理动画结束事件

使用completion闭包处理动画结束事件,让你的动画更上一层楼!🎉 动画完成后的操作,尽在掌握!

什么是Completion闭包?

Completion闭包就像一个动画完成后的“回调函数”。当动画结束后,系统会自动执行这个闭包里的代码。你可以用它来更新UI、启动新的动画,或者做任何需要在动画完成后执行的事情。想象一下,你希望一个视图移动到屏幕中央后,立刻改变颜色。Completion闭包就能帮你实现这个效果!

如何使用Completion闭包?

UIView.animate(withDuration:animations:completion:) 是关键!这个方法允许你设置动画的持续时间、动画内容,以及一个completion闭包。

swift
UIView.animate(withDuration: 1.0, animations: {
    // 动画内容:例如,移动视图
    myView.frame.origin.x += 100
}) { (finished) in
    // completion闭包:动画完成后执行的代码
    if finished {
        myView.backgroundColor = UIColor.red
        print("动画完成!视图颜色已变为红色。")
    }
}
  • withDuration: 动画持续时间(秒)。
  • animations: 动画的具体内容,例如改变视图的位置、大小、透明度等。
  • completion: 一个闭包,类型为 ((Bool) -> Void)?finished 参数表示动画是否正常完成。

Completion闭包的优势

  1. 精确控制: 确保动画完成后才执行特定代码,避免出现UI状态不一致的情况。
  2. 链式动画: 可以轻松地将多个动画串联起来,实现复杂的动画序列。
  3. 错误处理: 通过 finished 参数,可以判断动画是否被中断,并进行相应的处理。

实例演示:淡入淡出动画

假设你想要让一个视图先淡入,然后淡出。使用completion闭包,可以轻松实现:

swift
myView.alpha = 0 // 初始透明度为0

UIView.animate(withDuration: 1.0, animations: {
    myView.alpha = 1 // 淡入
}) { (finished) in
    if finished {
        UIView.animate(withDuration: 1.0, animations: {
            myView.alpha = 0 // 淡出
        })
    }
}

这个例子中,第一个动画让视图淡入,当淡入动画完成后,completion闭包里的代码会被执行,启动淡出动画。是不是很简单?😎

注意事项

  • 避免循环引用: 在completion闭包中使用 self 时,要小心循环引用。可以使用 [weak self][unowned self] 来避免。
  • 线程安全: 如果需要在completion闭包中更新UI,确保在主线程上执行。可以使用 DispatchQueue.main.async
swift
UIView.animate(withDuration: 1.0, animations: {
    // 动画内容
}) { [weak self] (finished) in
    DispatchQueue.main.async {
        // 更新UI
        self?.myView.backgroundColor = UIColor.blue
    }
}

掌握completion闭包,你就能更好地控制动画的执行流程,创建更流畅、更专业的iOS应用!🚀 动画的世界,等你来探索!

本站使用 VitePress 制作