自定义转换iOS(推送/弹出)

自定义转换iOS(推送/弹出),ios,objective-c,animation,uiviewcontroller,custom-transition,Ios,Objective C,Animation,Uiviewcontroller,Custom Transition,当按下新的viewController时,我创建了一个自定义的放大转换,它过去工作得非常好。现在我想在弹出viewController时创建一个缩小效果,即使最后的状态是正确的,动画也是错误的,因为我不知道如何识别它是在推还是弹出,所有的方法,如isBeingPresented返回false,而presentedViewController总是为零 -(void)animateTransition:(id<UIViewControllerContextTransitioning>)t

当按下新的viewController时,我创建了一个自定义的放大转换,它过去工作得非常好。现在我想在弹出viewController时创建一个缩小效果,即使最后的状态是正确的,动画也是错误的,因为我不知道如何识别它是在推还是弹出,所有的方法,如
isBeingPresented
返回false,而
presentedViewController
总是为零

-(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];
}
-(void)animateTransfion:(id)transitionContext
{
self.transitionContext=transitionContext;
UIView*containerView=[transitionContext containerView];
UIViewController*fromViewController=(UIViewController*)[transitionContext ViewControllerWorkey:UITransitionContextFromViewControllerKey];
UIViewController*toViewController=(UIViewController*)[transitionContext ViewControllerWorkey:UITransitionContextToViewControllerKey];
[containerView添加子视图:toViewController.view];
CABasicAnimation*scaleAnimation=[CABasicAnimation animationWithKeyPath:@“transform.scale”];
scaleAnimation.duration=[自转换持续时间:transitionContext];
scaleAnimation.delegate=self;
scaleAnimation.removedOnCompletion=是;
CABasicAnimation*opacityAnimation=[CABasicAnimation animationWithKeyPath:@“opacity”];
opacityAnimation.duration=[自转换持续时间:transitionContext];
opacityAnimation.delegate=self;
opacityAnimation.removedOnCompletion=是;
如果(显示的是视图控制器){
scaleAnimation.fromValue=[NSNumber numberWithDouble:0];
scaleAnimation.toValue=[NSNumber numberWithDouble:1];
opacityAnimation.fromValue=[NSNumber numberWithFloat:1];
opacityAnimation.toValue=[NSNumber numberWithFloat:0];
}否则{
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];
}

您可以保存
UINavigationControllerOperation
变量:

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

    return self;
}

这与上面的代码没有关联,但这将覆盖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)];

希望这也能对您有所帮助:)

请参见我的带有pop动画的推送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);
       }
}
- (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);
       }
}