Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS 7 UINavigationController NavBar per controller color animation

Is there any way to have different barTintColor of UINavigationController's UINavigationBar on different pushed controllers with smooth color transition animation?

I'd like to have a smooth animation of UINavigationBar's tint color during UINavigationController's push/pop animation and ideally also interactive pop (gesture based controller pop).

Why do I need this? I'd like to have 1 controller in the navigation stack to have different tint color indicating status of some task (red / green etc.).

What I have tried so far:

  • viewWillAppear (view lifecycle) methods, but there is no way to animate the barTintColor (like setBarTintColor:animated:)
  • To change barTintColor in [UIView animation...] block, but that just weirdly animates frame of (probably) some background layer instead of smooth color transition.
  • To change barTintColor in [UIView transitionWithView:...] block with UIViewAnimationOptionTransitionCrossDissolve, but that does not animate change. Just instantly changes to new tint color after the animation duration
  • I had an idea of implementing new iOS 7 custom transition calculating and changing color of navbar during progress, but that seems to be big overkill (specially if I want to keep original animation appearance everywhere)

Thank you everyone for any ideas and answers

like image 807
Lukas Kukacka Avatar asked Oct 09 '13 12:10

Lukas Kukacka


1 Answers

You can get this by using UIViewControllerTransitionCoordinator.

  1. Copy the example code to the AController and customize the colors.
  2. Copy the example code to the BController and customize the colors.
  3. That's it! During UINavigationController's push/pop transition, the AController's style will smoothly fade in/out to BController's style.

Example code:

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    [[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        self.navigationController.navigationBar.translucent = NO;
        self.navigationController.navigationBar.barStyle = UIBarStyleDefault;

        // text color
        [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];

        // navigation items and bar button items color
        self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

        // background color
        self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
    } completion:nil];
}
like image 170
Noel Avatar answered Nov 08 '22 19:11

Noel