0

Я создал настраиваемый переход с увеличением, когда нажав новый viewController, и он работал отлично. Теперь я хочу создать эффект масштабирования, когда popping viewController и даже подумал, что конечное состояние верное, анимация неправильная, так как я не знаю, как определить, если она толкает или выскакивает, и все методы как isBeingPresented возвращение ложным и presentedViewController всегда нольПользовательский переход iOS (Push/Pop)

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    self.transitionContext = transitionContext; 

    UIView *containerView = [transitionContext containerView]; 
    UIViewController *fromViewController = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIViewController *toViewController = (UIViewController *) [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 

    [containerView addSubview:toViewController.view]; 

    CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
    scaleAnimation.duration = [self transitionDuration:transitionContext]; 
    scaleAnimation.delegate = self; 
    scaleAnimation.removedOnCompletion = YES; 

    CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    opacityAnimation.duration = [self transitionDuration:transitionContext]; 
    opacityAnimation.delegate = self; 
    opacityAnimation.removedOnCompletion = YES; 

    if (toViewController.isBeingPresented) { 
    scaleAnimation.fromValue = [NSNumber numberWithDouble:0]; 
    scaleAnimation.toValue = [NSNumber numberWithDouble:1]; 

    opacityAnimation.fromValue = [NSNumber numberWithFloat:1]; 
    opacityAnimation.toValue = [NSNumber numberWithFloat:0]; 
    } else { 
    scaleAnimation.fromValue = [NSNumber numberWithDouble:1]; 
    scaleAnimation.toValue = [NSNumber numberWithDouble:0]; 

    opacityAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    opacityAnimation.toValue = [NSNumber numberWithFloat:1]; 
    } 

    [toViewController.view.layer addAnimation:scaleAnimation forKey:nil]; 
    [fromViewController.view.layer addAnimation:opacityAnimation forKey:nil]; 
} 

ответ

2

вы можете сохранить UINavigationControllerOperation переменную:

-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController 
            animationControllerForOperation:(UINavigationControllerOperation)operation 
               fromViewController:(UIViewController*)fromVC 
               toViewController:(UIViewController*)toVC { 
    self.navigationOperation = operation; 

    return self; 
} 

то проверить это будет толкать или поп:

if (self.navigationOperation == UINavigationControllerOperationPush) { 
    // push 
} else if (self.navigationOperation == UINavigationControllerOperationPop) { 
    // pop 
} 
+0

Работал как очарование, спасибо! – mtet88

+0

Я рад, что он решил вашу проблему :) – Bannings

0

Это не связанно с вашим кодом выше, но это будет переопределить анимации по умолчанию navigationController ..

//.h 
@interface YJKit_Navigation : UINavigationController 

+ (void)navigation:(UINavigationController *)navigationController withViewController:(UIViewController *)viewController push:(BOOL)isPush; 

@end 

//.m 
@implementation YJKit_Navigation 

+ (void)navigation:(UINavigationController *)navigationController withViewController:(UIViewController *)viewController push:(BOOL)isPush 
{ 

    [navigationController.view.layer addAnimation: isPush ? PushAnimation : PopAnimation forKey:nil]; 

    isPush ? [navigationController pushViewController:viewController animated:NO] : [navigationController popViewControllerAnimated:NO]; 
} 

@end 

и используя это нравится:

[YJKit_Navigation navigation:YourUINavigationController withViewController:YourTargetUIViewController push:(BOOL)]; 

Надеется, что это также поможет вам. . :)

0

Смотрите мой вариант нажимной ViewController с поп-анимации

- (void)navigationController:(UINavigationController *)navigationController 
       present:(UIViewController *)viewController 
       animated:(BOOL)animated 
       completion:(void (^)(BOOL finished))completion { 
     self.completion = completion; 
    if (animated) { 
     CATransition *animation = [CATransition animation]; 
     [animation setDelegate:self]; 
     [animation setType:kCATransitionMoveIn]; 
     [animation setSubtype:kCATransitionFromTop]; 
     [animation setDuration:kPresentAnimationDuration]; 
     [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

     [navigationController.view.layer addAnimation:animation forKey:kCATransition]; 
    } 

     [navigationController pushViewController:viewController animated:NO]; 
     if (!animated) { 
      self.completion(YES); 
     } 
}