參考資料:
Apple 開發(fā)文檔 Customizing the Transition Animations
WWDC 2013 Custom Transitions Using View Controllers
圖例:
跳轉(zhuǎn)的動畫有很多,全部可以自定義
創(chuàng)建自定義跳轉(zhuǎn)必須遵循的三個步驟:
1、創(chuàng)建一個類,并實現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議
2、創(chuàng)建一個類作為 UIViewControllerTransitioningDelegate 過渡代理
3、在模態(tài)跳轉(zhuǎn)前修改控制器的 transitioningDelegate 代理為自定義的代理(步驟2的代理類)
核心代碼示例
一、創(chuàng)建一個類,并實現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議
這個協(xié)議主要控制控制器視圖的顯示的,通過 transitionContext 可以獲取到每個視圖和控制器,并進行動畫的設(shè)置
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) } } } |
二、創(chuàng)建一個類作為 UIViewControllerTransitioningDelegate 過渡代理
這里設(shè)置 presented 和 dismissed 時各自的動畫轉(zhuǎn)換類,可以設(shè)置為不同的類
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 } } |
三、在模態(tài)跳轉(zhuǎn)前修改控制器的 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 控制器自定義動畫跳轉(zhuǎn)方法(模態(tài)跳轉(zhuǎn))就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/Mazy_ma/article/details/78969264