2012-05-28 122 views
10

我想使用自定義塞格來執行一種縮放動畫。 執行轉換時,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){ 
        }]; 

} 

我在做什麼錯了?

回答

16

感覺很糟糕,但是您可以嘗試在動畫之前將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