【问题标题】:Custom Segue Animation自定义 Segue 动画
【发布时间】:2012-06-02 12:29:39
【问题描述】:

我正在尝试使用自定义转场来执行一种缩放动画。 执行过渡时,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){
                     }];

}

我做错了什么?

【问题讨论】:

    标签: ios uiview uiviewanimation uistoryboardsegue


    【解决方案1】:

    感觉很笨拙,但是您可以尝试在动画之前添加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;
    

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

    - (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
    

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多