参考资料:
Apple 开发文档 Customizing the Transition Animations
WWDC 2013 Custom Transitions Using View Controllers
图例:
跳转的动画有很多,全部可以自定义
创建自定义跳转必须遵循的三个步骤:
1、创建一个类,并实现了 UIViewControllerAnimatedTransitioning 协议
2、创建一个类作为 UIViewControllerTransitioningDelegate 过渡代理
3、在模态跳转前修改控制器的 transitioningDelegate 代理为自定义的代理(步骤2的代理类)
核心代码示例
一、创建一个类,并实现了 UIViewControllerAnimatedTransitioning 协议
这个协议主要控制控制器视图的显示的,通过 transitionContext 可以获取到每个视图和控制器,并进行动画的设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
class AnimatedTransitioning: NSObject {
var isPresenting: Bool = false
}
extension AnimatedTransitioning: UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let fromView = transitionContext.view(forKey: .from)!
let toView = transitionContext.view(forKey: .to)!
let containerView = transitionContext.containerView
if isPresenting {
toView.transform = CGAffineTransform(scaleX: 0, y: 0)
containerView.addSubview(toView)
} else {
containerView.insertSubview(toView, belowSubview: fromView)
}
UIView.animate(withDuration: 0.5, animations: {
if self.isPresenting {
toView.transform = CGAffineTransform.identity
} else {
fromView.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
}
}) { (finished) in
transitionContext.completeTransition(finished)
}
}
}
|
二、创建一个类作为 UIViewControllerTransitioningDelegate 过渡代理
这里设置 presented 和 dismissed 时各自的动画转换类,可以设置为不同的类
1
2
3
4
5
6
7
8
9
10
11
12
|
class CustomTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let at = AnimatedTransitioning()
at.isPresenting = true
return at
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let at = AnimatedTransitioning()
at.isPresenting = false
return at
}
}
|
三、在模态跳转前修改控制器的 transitioningDelegate 代理为自定义的代理
注意:代理不能为局部变量
1
2
3
4
5
6
7
8
9
|
class ViewController: UIViewController {
// 必须保存为实例变量
var ctDelegate = CustomTransitioningDelegate()
override func touchesBegan(_ touches: Set< UITouch >, with event: UIEvent?) {
let vc = TempViewController()
vc.transitioningDelegate = ctDelegate
self.present(vc, animated: true, completion: nil)
}
}
|
以上这篇iOS 控制器自定义动画跳转方法(模态跳转)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/Mazy_ma/article/details/78969264