Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent the animation when clicking "Back" button in a navigation bar?

My application has a navigation controller and I don't want any animation in it :

  • to prevent an animation when pushing a view, it's easy, via the pushViewController:animated: method

  • but when I click the "back" button on this subview, there's an animation ! KO ! What can I do to prevent this animation ?

like image 583
Dirty Henry Avatar asked Jun 25 '10 15:06

Dirty Henry


3 Answers

This prevents default animation.

- (void)viewWillDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: NO];
}

- (void)viewDidDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: YES];
}

In case if you need a custom animation

- (void)viewWillDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: NO];

    CATransition *transition = [CATransition animation];
    transition.duration = 0.3;
    transition.type = kCATransitionFade;
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
}

- (void)viewDidDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: YES];
}
like image 164
Evgeny Karpov Avatar answered Nov 20 '22 08:11

Evgeny Karpov


More elegant with a category. This assumes you navigation controller object is set in your app delegate. Just put this before your @implementaion in the root view controller.

#import "AppDelegate.h"

@implementation UINavigationBar (custom)
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated;
{

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end
like image 44
Martin Avatar answered Nov 20 '22 06:11

Martin


I came to SO looking for a more elegant solution, but here's how I've been (successfully) doing it so far.

The basic idea:

  1. DO NOT use UINavigationController; instead use it's constituent parts (e.g. UINavigationBar) and do the work yourself
  2. Trigger the navbar to animate in parallel with your own custom animations (or not, if you want no anim at all)

The downsides:

  1. UINavigationController handles some other things, like memory loading/unloading, automatically. Also, it's "hard coded" into all UIViewControllers - they ALWAYS have a reference to the UINavigationController that contains them. It's a shame to throw all this away just because Apple doesn't provide a hook for setting custom anims.

Code - in whichever class takes over for the animation:

UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"];
[navigationController.navigationBar pushNavigationItem:backItem animated:TRUE];
// next line only needed if you want a custom back anim too
navigationController.navigationBar.delegate = self;

...if you also want to cut-in with custom back animation, you need that last line above, so that you can then listen to the navbar, and react in parallel, like this:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    // trigger your custom back animation here

    return TRUE;
}
like image 3
Adam Avatar answered Nov 20 '22 06:11

Adam