user1747629
user1747629

Reputation: 51

Fade effect when going from one viewController to other using Navigation Controller

How to achieve fade effect when going from one viewController to other using navigation Controller

normally we do to push :

DetailViewController *obj= [[DetailViewController alloc]initWithNibName:@"DetailView" bundle:nil];
[self.navigationController pushViewController:obj animated:YES];

and to pop :

UINavigationController *navController = self.navigationController;

// retain ourselves so that the controller will still exist once it's popped off
 [[self retain] autorelease];

// Pop this controller and replace with another
[navController popViewControllerAnimated:YES];

But I want fading effect when I do pop or push .. plz suggest

Upvotes: 0

Views: 2251

Answers (2)

kristofkalai
kristofkalai

Reputation: 444

I rewrote The iOSDev's solution (thanks!) in Swift 5+ (without deprecation warnings etc.):

Push:

UIView.transition(with: navigationController.view, duration: 0.5, options: [.transitionCrossDissolve], animations: {
    self.navigationController.pushViewController(viewControllerToBeShown, animated: false)
}) { _ in
    completion()
}

Pop:

UIView.transition(with: navigationController.view, duration: 0.5, options: [.transitionCrossDissolve], animations: {
    self.navigationController.popViewController(animated: false)
}) { _ in
    completion()
}

Upvotes: 0

The iOSDev
The iOSDev

Reputation: 5267

this is not the exact code you want but you can get the way how to do the animation you want

First have to pass the parameter NO for any animation while push and pop view and have to give some custom animation like this

// Flash the screen white and fade it out to give UI feedback that a still image was taken
    UIView *flashView = [[UIView alloc] initWithFrame:[[self videoPreviewView] frame]];
    [flashView setBackgroundColor:[UIColor whiteColor]];
    [[[self view] window] addSubview:flashView];

    [UIView animateWithDuration:.4f
                     animations:^{
                         [flashView setAlpha:0.f];
                     }
                     completion:^(BOOL finished){
                         [flashView removeFromSuperview];
                     }
     ];

For more detail answer and use the block in proper way see this answer on other question on SO

Some of the code from that answer is as follow

For Push:

MainView *nextView = [[MainView alloc] init];
[UIView animateWithDuration:0.75
                         animations:^{
                             [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                             [super pushViewController:nextView animated:NO];
                             [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
                         }];

For Pop:

[UIView animateWithDuration:0.75
                         animations:^{
                             [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                             [UIView setAnimationTransition:transition forView:self.navigationController.view cache:NO];
                         }];
[self.navigationController popViewControllerAnimated:NO];

Thanks to @ijordan

Some other tips for the problem is here

This one is one excellent example for your use no use to do extra coding with this as it provides category for animation of navigation controller.

Upvotes: 1

Related Questions