首页
学习
活动
专区
圈层
工具
发布

UIView块-动画完成始终为真

UIView动画完成回调始终为true的问题分析

基础概念

UIView动画是iOS开发中常用的动画实现方式,通过animate(withDuration:animations:completion:)方法可以创建简单的视图动画。其中completion回调参数用于在动画完成后执行某些操作。

问题描述

当使用UIView动画时,有时会发现completion回调中的finished参数始终为true,即使动画被中断或取消。

原因分析

  1. UIView动画的特性:UIView动画默认使用"开始即完成"的模型,一旦动画开始执行,系统就认为它"已完成",即使被后续动画覆盖或中断。
  2. 隐式动画:UIView动画实际上是基于Core Animation的隐式动画,系统会自动处理动画的中断和衔接。
  3. 动画队列:UIKit会自动管理动画队列,新动画会平滑地替换旧动画,而不是直接取消。

解决方案

方法1:使用Core Animation显式动画

代码语言:txt
复制
let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = oldPosition
animation.toValue = newPosition
animation.duration = 1.0
animation.delegate = self
layer.add(animation, forKey: "positionAnimation")

// 实现CAAnimationDelegate
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
    // flag会正确反映动画是否完成
}

方法2:使用UIViewPropertyAnimator(iOS 10+)

代码语言:txt
复制
let animator = UIViewPropertyAnimator(duration: 1.0, curve: .linear) {
    // 动画代码
}

animator.addCompletion { position in
    // position会反映动画状态:.end表示完成,.start表示未完成
}

animator.startAnimation()

方法3:使用UIView.animateKeyframes

代码语言:txt
复制
UIView.animateKeyframes(withDuration: 2.0, delay: 0.0, options: [], animations: {
    UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5) {
        // 第一阶段动画
    }
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
        // 第二阶段动画
    }
}, completion: { finished in
    // finished参数会更准确
})

应用场景

  1. 需要精确控制动画状态时(如游戏开发)
  2. 动画被打断时需要执行不同逻辑时
  3. 需要实现复杂的动画序列时

注意事项

  1. UIView动画适合简单的视图属性变化动画
  2. 对于需要精确控制的动画,建议使用Core Animation或UIViewPropertyAnimator
  3. 在iOS 10及以上版本,优先考虑使用UIViewPropertyAnimator

通过以上方法,可以更准确地获取动画的真实完成状态,而不是始终为true的completion参数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券