Reversal of Custom Segue with Storyboarding

I have a custom segue animation that occurs when pushing a new view controller onto the stack. When popping the view controller that was presented with said custom segue, however, the default navigation controller animation happens (that is, the current view controller animates to the right while the parent view controller translates on-screen from the left edge).

So my question is this: is there a way to write a custom pop segue animation which happens when popping a view controller off the stack?

  • UITableView infinite scrolling
  • Getting PCM data of HLS from AVPlayer
  • UICollectionView autosize height
  • Use more than one Firebase database in single app - Swift
  • How to animate a button change in UINavigationBar?
  • Calculate cell height based on cell's text in iOS 7
  • Edit (solution):

    I ended up defining a custom segue similar to the selected answer. In the Storyboard, I dragged a custom segue from the child view controller back to its parent, gave it an identifier and the newly written reverse segue as its class. Yes, I realize it is virtually identical to a modal transition. Client requirements necessitated this madness, so before anyone comments, understand that I know one shouldn’t have to do this under normal circumstances.

    - (void)perform {
      UIViewController *src = (UIViewController *)self.sourceViewController;
      UIViewController *dest = (UIViewController *)self.destinationViewController;
    
      [UIView animateWithDuration:0.3 animations:^{
        CGRect f = src.view.frame;
        f.origin.y = f.size.height;
        src.view.frame = f;
    
      } completion:^(BOOL finished){
        src.view.alpha = 0;
        [src.navigationController popViewControllerAnimated:NO];
      }];
    }
    

    3 Solutions Collect From Internet About “Reversal of Custom Segue with Storyboarding”

    Yes. Here is an example where I pop to the top level. When your create the segue in Storyboard. Use select or enter the new new segue class in the attributes inspector.

    //
    //  FlipTopPop.h
    
    #import <UIKit/UIKit.h>
    
    
    @interface FlipTopPopToRoot : UIStoryboardSegue
    
    @end
    

    and

    //  FlipTopPop.m
    
    #import "FlipTopPopToRoot.h"
    
    @implementation FlipTopPopToRoot
    
    - (void) perform {
    
        UIViewController *src = (UIViewController *) self.sourceViewController;
        [UIView transitionWithView:src.navigationController.view duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    animations:^{
                        [src.navigationController popToViewController:[src.navigationController.viewControllers objectAtIndex:0] animated:NO];;
                    }
                        completion:NULL];
    }
    
    @end
    

    If you want to pop up just one level change use this custom segue:

    //  PopSegue.h
    
    #import <UIKit/UIKit.h>
    
    @interface PopSegue : UIStoryboardSegue
    
    @end
    

    and

    //  PopSegue.m
    
    #import "PopSegue.h"
    
    @implementation PopSegue
    
    - (void) perform {
    
        UIViewController *src = (UIViewController *) self.sourceViewController;
        [src.navigationController popViewControllerAnimated:YES];
    }
    

    @end

    For anyone following this now, iOS 7 lets you animate both ways:

    Set the segue to Push, then see code below for a push implementation.

    https://github.com/Dzamir/OldStyleNavigationControllerAnimatedTransition

    As the commenter Linus pointed out, the other solutions presented will create another instance of the UIViewController. I think this link here describe other alternatives to enabling reverse segue animations.

    http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html