UIImageView 等待动画完成

Posted

技术标签:

【中文标题】UIImageView 等待动画完成【英文标题】:UIImageView wait for animation complete 【发布时间】:2017-03-14 15:47:00 【问题描述】:

我正在尝试执行 2 个不同的动画,在第一次完成后,使用 isAnimating

但是,我只看到第一个动画...

if anims[0] == 1
    startAnimation(image : #imageLiteral(resourceName: "first"))

if anims[1] == 2
    while myView.isAnimating 
        RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05))
    

startAnimation(image : #imageLiteral(resourceName: "second") , time : Int)

spriteSheet 裁剪后返回 UIImage 数组..

func startAnimation(image : UIImage , time : Int)
   myView.animationImages = image.spriteSheet(cols: 19, rows: 1)
    myView.animationDuration = 1
    myView.animationRepeatCount = time
    myView.startAnimating()

【问题讨论】:

请查看更新后的答案:) 【参考方案1】:

你总是可以像

这样链接动画
    UIView.animate(withDuration: 1, animations: 
        //do your animation here
    )  (state) in
        UIView.animate(withDuration: 1, animations: 
            //do your second animation
        )
    

如果您使用的是 CABasicAnimations,那么您可以使用 beginTime 和 duration 将它们链接起来 :)

    var totalDuration = 0
    let baseicAnim1 = CABasicAnimation()
    baseicAnim1.beginTime = CACurrentMediaTime()
    totalDuration += 10
    baseicAnim1.duration = CFTimeInterval(totalDuration)

    let basicAnim2 = CABasicAnimation()
    basicAnim2.beginTime = CACurrentMediaTime() + CFTimeInterval(totalDuration)
    totalDuration += 10
    basicAnim2.duration = CFTimeInterval(totalDuration)

编辑

使用 while 循环继续检查动画是否已完成执行从来都不是建议的方法

编辑:

试试这个,

func startAnimation(image : UIImage , time : Int,completionBlock : (()->())?)
    let animationDuration = 1
    myView.animationImages = image.spriteSheet(cols: 19, rows: 1)
    myView.animationDuration = animationDuration
    myView.animationRepeatCount = time
    myView.startAnimating()

    DispatchQueue.main.asyncAfter(deadline: .now() + animationDuration, execute: 
        if let block = completionBlock 
            block()
        
    )

现在您的 startAnimation 函数将完成块作为其参数,并在 animationDuration 之后执行完成块。所以你可以知道动画什么时候结束:)

链接只需调用

self.startAnimation(image: #imageLiteral(resourceName: "first"), time: 1)  
            self.startAnimation(image: #imageLiteral(resourceName: "second"), time: 1, completionBlock: nil)
        

希望对你有帮助

【讨论】:

我使用的是UIImageView,而不是UIView。我的方法startAnimation() 使用animationImages 循环遍历 @marry-g : 在 startAnimation() 中显示你的代码那到底在做什么? 已添加,请立即查看 重点是,两个动画不一定一个接一个。我有条件,if anims[0] == 1 startAnimation... if anims[1] == 2 ... 他们不一定会在一起.. 还有.now() + animationDuration 表达式的类型在没有更多上下文的情况下是模棱两可的

以上是关于UIImageView 等待动画完成的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView 的 startAnimating 会在动画完成后自行移除吗?

当动画 UIImage 被分配两次时,UITableViewCell 中的 UIImageView 没有动画

UIImage Cross Dissolve 不使用 UIView transitionWithView 制作动画

通过图像更改为单个 UIImageView 编写多个动画

当 UIImage 改变时动画回退

在执行代码之前等待 Swift 动画完成