iosobjective-cuiviewuianimationcompletion-block

Doing an action after UIView beginAnimations is finish


I want to do an action when the UIView animation is finish.

    if (flipStateHav1 == 1 && btnFrontHav1.tag == 1) {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.8];

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:buttonContainerHav1 cache:YES];
    [self.buttonContainerHav1 bringSubviewToFront:btnBackHav1];

    [UIView commitAnimations];

    //It is this code below I want to run after the animation is finish.
    buttonContainerHav1.userInteractionEnabled = YES;
    flipTurns = 0;
    flipStateHav2 = 0;
    par = 0;
}

I have tried using

    completion:^(BOOL finished){
    // your code
}];

But don't get it to work, probably i do something wrong.

Update code The button is connected to two actions.

- (IBAction) buttonPressedFlipHav1 {

if (flipTurns == 0 || flipTurns == 1) {

    flipTurns += 1;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.8];

        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:buttonContainerHav1 cache:YES];
        [self.buttonContainerHav1 bringSubviewToFront:btnFrontHav1];
        buttonContainerHav1.userInteractionEnabled = NO;
        flipStateHav1 = 1;
        btnFrontHav1.tag = 1;

        autoFlipCount += 1;

        if (flipStateHav1 == 1 && flipStateHav2 == 1) {
            par = 1;
            parHav = 1;
            btnFrontHav1.tag = 0;
            btnFrontHav2.tag = 0;

            flipTurns = 0;
            autoFlipCount = 0;

            if (parHav == 1 && parRiddare == 1 && parSkold == 1) {

                autoFlipTimer = [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(autoFlipAll) userInfo:nil repeats:NO];

            }
        }

   } completion:^(BOOL finished) {

    NSLog(@"autoFlipCount = %d",autoFlipCount);
    NSLog(@"Flipturns = %d",flipTurns);
    }];

  }

}

And it is also connected to this action.

- (IBAction) autoFlip {
      autoFlipTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(callAfterFiveSecond) userInfo:nil repeats:NO];
}

After 5 seconds it jump to this if statement. Updated

if (flipStateHav1 == 1 && btnFrontHav1.tag == 1) {

    [UIView animateWithDuration:0.8 animations:^{

        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:buttonContainerHav1 cache:YES];
        [self.buttonContainerHav1 bringSubviewToFront:btnBackHav1];

    } completion:^(BOOL finished) {
        buttonContainerHav1.userInteractionEnabled = YES;
        flipTurns = 0;
        flipStateHav1 = 0;
        par = 0;
    }];

}

Solution

  • This code might help you

    [UIView animateWithDuration:0.4 animations:^{
       //animation code here`
    } completion:^(BOOL finished) {
          //code after animation here
    }];