自定义塞格动画

问题描述:

我想使用自定义塞格来执行一种缩放动画。 执行转换时,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){ 
        }]; 

} 

我在做什么错了?

感觉很糟糕,但是您可以尝试在动画之前将destinationViewController.view添加为子视图,然后在动画完成时将其删除并在没有动画的情况下将其推回。解决了黑屏过渡之前,但也许不是完美的,这取决于你想要什么用导航条做的,但也许更接近:

[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 Custom Transitions Using View Controllers

例如,如果试图做导航控制器定制过渡,第一视图控制器将指定本身作为导航控制器的委托:

self.navigationController.delegate = self; 

然后,它会指定推自定义动画和流行,分别为:

- (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]; 
    } 
} 

然后你会明显地实施这些动画师:

@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 
+0

谢谢,它的工作正常! – Nimrod7