@rounak has the right idea, but sometimes it helps to have code ready without having to download from github.
Here are the steps that I took:
- Make your FromViewController.m conform to - UINavigationControllerDelegate.  Other sample code out there tells you to conform to- UIViewControllerTransitioningDelegate, but that's only if you're presenting the ToViewController.
 - @interface ViewController : UIViewController  
- Return your custom transition animator object in the delegate callback method in FromViewController: - - (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                               animationControllerForOperation:(UINavigationControllerOperation)operation
                                            fromViewController:(UIViewController *)fromVC
                                              toViewController:(UIViewController *)toVC {
    TransitionAnimator *animator = [TransitionAnimator new];
    animator.presenting = (operation == UINavigationControllerOperationPush);
    return animator;
}
 
- Create your custom animator class and paste these sample methods: - - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext {
    return 0.5f;
    }
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext     {
// Grab the from and to view controllers from the context
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
// Set our ending frame. We'll modify this later if we have to
CGRect endFrame = CGRectMake(80, 280, 160, 100);
if (self.presenting) {
    fromViewController.view.userInteractionEnabled = NO;
    [transitionContext.containerView addSubview:fromViewController.view];
    [transitionContext.containerView addSubview:toViewController.view];
    CGRect startFrame = endFrame;
    startFrame.origin.x += 320;
    toViewController.view.frame = startFrame;
    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        fromViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        toViewController.view.frame = endFrame;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}
else {
    toViewController.view.userInteractionEnabled = YES;
    [transitionContext.containerView addSubview:toViewController.view];
    [transitionContext.containerView addSubview:fromViewController.view];
    endFrame.origin.x += 320;
    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        toViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
        fromViewController.view.frame = endFrame;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}
}
 
Essentially, the animator is the object doing the heavy lifting.  Of course, you can make your UINavigationControllerDelegate be a separate object, but that depends on how your architect your app.