Marry G
Marry G

Reputation: 389

UIImageView wait for animation complete

I'm trying to execute 2 different animations, after the first complete, using isAnimating.

but, I see only the first animation...

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 returns UIImage array after cropping..

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

Upvotes: 1

Views: 497

Answers (1)

Sandeep Bhandari
Sandeep Bhandari

Reputation: 20369

You can always chain animations like

    UIView.animate(withDuration: 1, animations: {
        //do your animation here
    }) { (state) in
        UIView.animate(withDuration: 1, animations: {
            //do your second animation
        })
    }

If you are using CABasicAnimations then you can use beginTime and duration to chain them up :)

    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)

EDIT

Using while loop to keep checking if animation has completed its execution or not is never a suggested approach

EDIT :

Try this,

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()
        }
    })
}

Now your startAnimation function takes completion block as its parameter and executes the completion block after animationDuration. So you can get to know when animation ends :)

to chain simply call

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

Hope it helps

Upvotes: 1

Related Questions