【问题标题】:ios 7 custom present and dismiss transitionios 7 自定义呈现和关闭过渡
【发布时间】:2013-09-20 19:33:13
【问题描述】:

我正在制作自定义呈现和关闭过渡,但遇到了一些问题。我想做的是在 iOS 7 中重复这个很酷的深度动画(当我们打开/关闭一些应用程序时)。 我有第一和第二控制器。所有动画都在 First 控制器中(它支持 UIViewControllerTransitioningDelegate 和 UIViewControllerAnimatedTransitioning)。所以,我只是在检查:如果它正在呈现 - 我正在做一个动画(放大第一和第二个视图),如果它正在关闭 - 我正在做另一个动画(缩小第一和第二个视图)。当前动画效果很好,问题出现在关闭动画中。出于某种原因,当我缩小我的第二个控制器(它是 UINavigationController)时,我看到它背后的黑色背景(这是错误的,因为我想在缩小我的第一个控制器时看到它)。这是我来自 First Controller 的代码

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    UIView *transitionView = [transitionContext containerView];

    id toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    id fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    BOOL isPresenting;

    isPresenting = [toViewController isKindOfClass:[UINavigationController class]];

    UINavigationController *navigator = isPresenting ? toViewController : fromViewController;

    if (isPresenting) {
        [transitionView addSubview:navigator.view];
        navigator.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
        navigator.view.alpha = 0;
    }

    navigator.view.center = self.startButton.center;

    void(^AnimationBlock)(void) = ^ {
        if (isPresenting) {
            navigator.view.transform = CGAffineTransformMakeScale(1, 1);
            self.view.transform = CGAffineTransformMakeScale(4, 4);
            navigator.view.alpha = 1;
            self.startButton.alpha = 0;
        } else {
            navigator.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
            self.view.transform = CGAffineTransformMakeScale(1, 1);
            navigator.view.alpha = 0;
            self.startButton.alpha = 1;
        }
    };

    [UIView animateWithDuration:1
                          delay:0.0f
         usingSpringWithDamping:50.0
          initialSpringVelocity:4
                        options:UIViewAnimationOptionLayoutSubviews
                     animations:^{
                         AnimationBlock();
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
        if (!isPresenting) {
            [navigator.view removeFromSuperview];
        }
    }];
}

- (void)completeTransitionInContext:(id<UIViewControllerContextTransitioning>)transitionContext{
    [transitionContext completeTransition:YES];
}


- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
    return 1;
}


- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    return self;
}

请告诉我是否应该提供一些额外的代码或屏幕。 提前致谢!

【问题讨论】:

  • iOS 7 API 仍处于保密协议下,直到公开发布(9 月 18 日)
  • 我有一个非常相似的问题,iOS7 API 不再处于 NDA 之下...您能解释一下如何解决它吗?谢谢!
  • 还是不知道答案:(

标签: ios objective-c iphone ios7


【解决方案1】:

如果要在当前转换完成后将 fromVC 保留在窗口层次结构中,则需要在 toVC 上设置 modalPresentationStyle = UIModalPresentationCustom。

查看我对 WWDC Session 218 示例代码的实现:使用视图控制器的自定义转换。如果您单击“选项”,您将看到这种类型的转换。相关代码在 SOLViewController.m prepareForSegue: 和 SOLOptionsTransitionAnimator.m

https://github.com/soleares/SOLPresentingFun

【讨论】:

    【解决方案2】:

    当您展示自定义 VC 时,您应该使用: vc.modalPresentationStyle = UIModalPresentationCustom; 但是,如果您输入错误 vc.modalTransitionStyle = UIModalPresentationCustom; 您将在自定义 VC 后面看到一个黑色背景

    【讨论】:

    • 感谢发帖。节省了我的时间。
    【解决方案3】:

    我认为最好为 Present 和 Dismiss 动画使用两个单独的 AnimationController 类并在父 ViewController 中实现 UIViewControllerTransitioningDelegate(animationControllerForPresentedControlleranimationControllerForDismissedController)。

    要创建一个AnimationController,只需继承NSObject 并在那里实现UIViewControllerAnimatedTransitioning

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多