View transition doesn't animate during custom pop segue

I’m using a custom segue to create an expand animation when I push new view controllers onto my navigation stack. If no sourceRect is specified when prepareForSegue:sender: is called, then the destination view controller is expanded from the center of the source view controller.

ExpandSegue.m:

  • why do I get “wait_fences: failed to receive reply” for this code?
  • Disabling back button and put Cancel button in navigation view controller — like contacts iPhone application
  • How do I programmatically set the Return Key for a particular UITextField?
  • Expand UILabel inside UITableView with “more” button like Instagram
  • Play Video From URL in WatchOS 2
  • Upload things to a FTP in Objective-C iOS
  • - (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination {
        self = [super initWithIdentifier:identifier source:source destination:destination];
    
        self.sourceRect = CGRectMake(source.view.center.x, source.view.center.y, 0.0, 0.0);
    
        return self;
    }
    
    - (void)perform {
        UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
        UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
    
        CGRect destinationRect = sourceViewController.view.frame;
        CGFloat tx = self.sourceRect.origin.x + self.sourceRect.size.width/2 - destinationRect.origin.x - destinationRect.size.width/2;
        CGFloat ty = self.sourceRect.origin.y + self.sourceRect.size.height/2 - destinationRect.origin.y - destinationRect.size.height/2;
        CGFloat sx = self.sourceRect.size.width/destinationRect.size.width;
        CGFloat sy = self.sourceRect.size.height/destinationRect.size.height;
    
        [sourceViewController.view addSubview:destinationViewController.view];
        [destinationViewController.view setFrame:sourceViewController.view.frame];
        [destinationViewController.view setTransform:CGAffineTransformConcat(CGAffineTransformMakeScale(sx, sy), CGAffineTransformMakeTranslation(tx, ty))];
    
        [UIView animateWithDuration:0.5
                              delay:0.0
                            options:UIViewAnimationCurveEaseOut
                         animations:^{
                             [destinationViewController.view setTransform:CGAffineTransformIdentity];
                         } completion:^(BOOL finished) {
                             [destinationViewController.view removeFromSuperview];
                             [sourceViewController.navigationController pushViewController:destinationViewController animated:NO];
                         }];
    }
    

    The expand segue works as expected. I tried to create a collapse segue by reversing the logic from the expand segue, but this has given me problems. I want the source view controller to shrink down to the size of the destinationRect. If no destinationRect is supplied, then I want the view to shrink to the center of the destination view controller’s view.

    CollapseSegue.m:

    - (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination {
        self = [super initWithIdentifier:identifier source:source destination:destination];
    
        self.destinationRect = CGRectMake(source.view.center.x, source.view.center.y, 0.0, 0.0);
    
        return self;
    }
    
    - (void)perform {
        UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
        UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
    
        CGRect sourceRect = sourceViewController.view.frame;
        CGFloat tx = self.destinationRect.origin.x + self.destinationRect.size.width/2 - sourceRect.origin.x - sourceRect.size.width/2;
        CGFloat ty = self.destinationRect.origin.y + self.destinationRect.size.height/2 - sourceRect.origin.y - sourceRect.size.height/2;
        CGFloat sx = self.destinationRect.size.width/sourceRect.size.width;
        CGFloat sy = self.destinationRect.size.height/sourceRect.size.height;
    
        [sourceViewController.navigationController popViewControllerAnimated:NO];
        [destinationViewController.view addSubview:sourceViewController.view];
        [sourceViewController.view setFrame:destinationViewController.view.frame];
    
        [UIView animateWithDuration:0.5
                              delay:0.0
                            options:UIViewAnimationCurveEaseOut
                         animations:^{
                             [sourceViewController.view setTransform:CGAffineTransformConcat(CGAffineTransformMakeScale(sx, sy), CGAffineTransformMakeTranslation(tx, ty))];
                         } completion:^(BOOL finished) {
                             [sourceViewController.view removeFromSuperview];
                         }];
    }
    

    Rather than animating nicely, the view for the sourceViewController simply disappears as if I had only called [sourceViewController.navigationController popViewControllerAnimated:NO]; This would seem to indicate that I’m not setting up my view hierarchy properly, but I can’t seem to figure out where I’m going wrong! Any help would be greatly appreciated.