如何自定义模态视图控制器的呈现动画?

25

我想要添加CAAnimation(或其他方式)来执行自定义动画,在导航控制器中替代设置uiviewcontroller的modalTransitionStyle

CATransition* transition = [CATransition animation];
          transition.duration = 0.4;
          transition.type = kCATransitionFade;
          transition.subtype = kCATransitionFromBottom;
          [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
          [self.navigationController pushViewController:adjustViewController animated:NO];

我该如何将它实现到模态视图控制器中?

3个回答

56

您只需将过渡效果添加到窗口的层,并呈现您的控制器,而不是将其推入:

     CATransition* transition = [CATransition animation];
     transition.duration = 1;
     transition.type = kCATransitionFade;
     transition.subtype = kCATransitionFromBottom;
     [self.view.window.layer addAnimation:transition forKey:kCATransition];
     [self presentViewController:adjustViewController animated:NO completion:nil];

1
相比于设置实现UIViewControllerAnimatedTransitioning的委托,这样做有什么优缺点? - Andrew Duncan
1
以上代码适用于iOS2及以上版本,UIViewControllerAnimatedTransitioning自iOS 7.0起存在。 - Matthieu Riegler

8

Swift 版本

let viewController = YourViewController()
let transition = CATransition()
transition.duration = 0.5
transition.type = kCATransitionFade
transition.subtype = kCATransitionFromBottom
view.window!.layer.add(transition, forKey: kCATransition)
present(viewController, animated: false, completion: nil)

7

来自苹果开发指南:

使用自定义动画呈现视图控制器

要使用自定义动画呈现视图控制器,请在现有视图控制器的操作方法中执行以下操作:

  • 创建要呈现的视图控制器。

  • 创建自定义转换代理对象,并将其分配给视图控制器的transitioningDelegate属性。当被问到时,您的转换代理的方法应该创建并返回您的自定义动画对象。

  • 调用presentViewController:animated:completion:方法来呈现视图控制器。

...


1
您还需要将视图控制器的 modalPresentationStyle 设置为 .custom。在iOS 7之后(2013年)使用此方法比使用 CATransition 更正确。 - bcattle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接