1. transitionFromViewController
UIViewController自帶的方法:
transitionFromViewController:toViewController:duration:options:animations:completion:
通常的使用場(chǎng)景是 在多個(gè)Child ViewController之間切換.
AViewController *a = self.childViewControllers[0];
BViewController *b = self.childViewControllers[1];
CViewController *c = self.childViewControllers[2];
// Curl 翻頁(yè)效果
// UIViewAnimationOptionTransitionCurlUp, UIViewAnimationOptionTransitionCurlDown
// Flip 翻轉(zhuǎn)效果
// UIViewAnimationOptionTransitionFlipFromLeft, UIViewAnimationOptionTransitionFlipFromRight
// UIViewAnimationOptionTransitionFlipFromTop, UIViewAnimationOptionTransitionFlipFromDown
[self transitionFromViewController:_currentViewController
toViewController:b
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight
animations:^{
} completion:^(BOOL finished) {
}];
2. CATransition
CATransition繼承自CALayer, 包含了一些場(chǎng)景的動(dòng)畫(huà)效果. 如Fade,Cube,Ripple,PageCurl,CameraIrilHollow等. 使用如下:
CATransition *animation = [CATransition animation];
animation.duration = 0.5;
animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;
animation.type = kCATransitionFade;
// 在當(dāng)前view上執(zhí)行CATransition動(dòng)畫(huà)
// [self.view.layer addAnimation:animation forKey:@"animation"];
// 在window上執(zhí)行CATransition, 即可在ViewController轉(zhuǎn)場(chǎng)時(shí)執(zhí)行動(dòng)畫(huà)。
[self.view.window.layer addAnimation:animation forKey:@"kTransitionAnimation"];
DemoCATransitionPresentedViewController *presentedVC = [[DemoCATransitionPresentedViewController alloc] init];
[self presentViewController:presentedVC animated:NO completion:nil];
[self.navigationController.view.layer addAnimation:animation forKey:@"kTransitionAnimation"];
DemoCATransitionPushedViewController *pushedVC = [[DemoCATransitionPushedViewController alloc] init];
[self.navigationController pushViewController:pushedVC animated:NO];
3. Transition Animation
自定義動(dòng)畫(huà):轉(zhuǎn)場(chǎng)動(dòng)畫(huà)實(shí)現(xiàn)細(xì)節(jié)須遵守UIViewControllerAnimatedTransitioning協(xié)議,實(shí)現(xiàn)該協(xié)議的對(duì)象中即包含了轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的細(xì)節(jié)實(shí)現(xiàn)代碼
// 轉(zhuǎn)場(chǎng)動(dòng)畫(huà)時(shí)間.
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
// 轉(zhuǎn)場(chǎng)動(dòng)畫(huà)細(xì)節(jié)實(shí)現(xiàn) 該方法中則主要負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)細(xì)節(jié)的實(shí)現(xiàn).
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
//由實(shí)現(xiàn)了本協(xié)議的對(duì)象創(chuàng)建的轉(zhuǎn)場(chǎng)如果是可被中斷的,那么可實(shí)現(xiàn)此方法。
//例如,可返回一個(gè)UIViewPropertyAnimator的實(shí)例。
//此方法被期望返回與轉(zhuǎn)場(chǎng)相同的實(shí)例對(duì)象
- (id <UIViewImplicitlyAnimating>) interruptibleAnimatorForTransition:(id <UIViewControllerContextTransitioning>)transitionContext
//動(dòng)畫(huà)結(jié)束回調(diào)方法
- (void)animationEnded:(BOOL) transitionCompleted
-
present/dismiss 動(dòng)畫(huà)
ViewControllerTransitionToShowVC *presentedVC = [[ViewControllerTransitionToShowVC alloc] init];
// 設(shè)置transitioningDelegate, 然后在其中實(shí)現(xiàn)協(xié)議方法即可.
presentedVC.transitioningDelegate = self;
[self presentViewController:presentedVC animated:YES completion:nil];
<UIViewControllerTransitioningDelegate>
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator;
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator;
- (nullable UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(nullable UIViewController *)presenting sourceViewController:(UIViewController *)source NS_AVAILABLE_IOS(8_0);
-
push/pop動(dòng)畫(huà)
self.navigationController.delegate = self;
[self.navigationController pushViewController:itemVC animated:YES];
<UINavigationControllerDelegate>主要實(shí)現(xiàn)方法
- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController NS_AVAILABLE_IOS(7_0);
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);
-
UITabBarController
<UITabBarControllerDelegate>主要實(shí)現(xiàn)方法
- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
animationControllerForTransitionFromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC;
github Demo
附圖

TransitionAnimation.png