自定义Segueanimation

我正在尝试使用自定义的segue来执行一种缩放animation。 当转换执行时,sourceViewController变黑,然后变焦。

也尝试将pushViewController:设置到完成块中,但是根本不执行转换。

- (void)perform { UIViewController *sourceViewController = (UIViewController *) self.sourceViewController; UIViewController *destinationViewController = (UIViewController *) self.destinationViewController; [destinationViewController.view setTransform:CGAffineTransformMakeScale(0.5,0.5)]; [destinationViewController.view setAlpha:0.0]; [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationCurveEaseOut animations:^{ [destinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)]; [destinationViewController.view setAlpha:1.0]; [sourceViewController.navigationController pushViewController:destinationViewController animated:NO]; } completion:^(BOOL finished){ }]; } 

我做错了什么?

感觉很糟糕,但是你可以尝试在animation之前添加destinationViewController.view作为子视图,然后当animation完成时,将其删除并在没有animation的情况下将其推回。 在转换之前解决黑屏问题,但可能并不完美,取决于您想要用导航栏做什么,但可能更接近:

 [sourceViewController.view addSubview:destinationViewController.view]; [destinationViewController.view setFrame:sourceViewController.view.window.frame]; [destinationViewController.view setTransform:CGAffineTransformMakeScale(0.5,0.5)]; [destinationViewController.view setAlpha:1.0]; [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationCurveEaseOut animations:^{ [destinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)]; [destinationViewController.view setAlpha:1.0]; } completion:^(BOOL finished){ [destinationViewController.view removeFromSuperview]; [sourceViewController.navigationController pushViewController:destinationViewController animated:NO]; }]; 

请注意,有效的iOS 7,你会使用自定义转换。 有关更多信息,请参阅使用视图控制器的 WWDC 2013 自定义转换 。

例如,如果尝试使用导航控制器进行自定义转换,则第一个视图控制器将自己指定为导航控制器的代表:

 self.navigationController.delegate = self; 

然后,它将分别为push和pop指定自定义animation器:

 - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { if (operation == UINavigationControllerOperationPush) { return [[PushAnimator alloc] init]; } else { return [[PopAnimator alloc] init]; } } 

然后你显然会实现这些animation师:

 @interface PushAnimator : NSObject <UIViewControllerAnimatedTransitioning> @end @implementation PushAnimator - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.5; } - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; [[transitionContext containerView] addSubview:toViewController.view]; toViewController.view.frame = fromViewController.view.frame; toViewController.view.transform = CGAffineTransformMakeScale(0.5,0.5); toViewController.view.alpha = 0.0; [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{ toViewController.view.transform = CGAffineTransformIdentity; toViewController.view.alpha = 1.0; } completion:^(BOOL finished) { [fromViewController.view removeFromSuperview]; [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } @end 

 @interface PopAnimator : NSObject <UIViewControllerAnimatedTransitioning> @end @implementation PopAnimator - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.5; } - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; [[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view]; toViewController.view.frame = fromViewController.view.frame; [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{ fromViewController.view.transform = CGAffineTransformMakeScale(0.5,0.5); fromViewController.view.alpha = 0.0; } completion:^(BOOL finished) { [fromViewController.view removeFromSuperview]; [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } @end