自定義轉(zhuǎn)場動(dòng)畫
在iOS7之后,UIViewController
之間進(jìn)行跳轉(zhuǎn)時(shí)地啰,可以對push
,pop
,present
,dismiss
添加自定義動(dòng)畫,實(shí)現(xiàn)很炫的跳轉(zhuǎn)效果。本文主要對轉(zhuǎn)場動(dòng)畫的使用方式進(jìn)行總結(jié)傲绣,實(shí)現(xiàn)自定義的轉(zhuǎn)場動(dòng)畫,主要是運(yùn)用到了以下幾個(gè)協(xié)議:
UIViewControllerAnimatedTransitioning
最關(guān)鍵的一個(gè)協(xié)議巩踏,用于實(shí)現(xiàn)自定義動(dòng)畫秃诵,主要包括以下兩個(gè)方法:
//定義動(dòng)畫的執(zhí)行時(shí)間
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
//添加自定義動(dòng)畫
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
通過實(shí)現(xiàn)animateTransition
協(xié)議來實(shí)現(xiàn)動(dòng)畫的具體實(shí)現(xiàn),通過transitionContext可以獲取到當(dāng)前的viewController
和將要跳轉(zhuǎn)的viewController
,通過獲取到對應(yīng)viewController
的view
可以用之前介紹的基礎(chǔ)動(dòng)畫來添加相應(yīng)的動(dòng)畫來實(shí)現(xiàn)轉(zhuǎn)場的動(dòng)畫塞琼,以下代碼是實(shí)現(xiàn)跳轉(zhuǎn)時(shí)進(jìn)行縮放的動(dòng)畫:
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext{
return 0.5;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView* toView = nil;
UIView* fromView = nil;
UIView* transView = nil;
if ([transitionContext respondsToSelector:@selector(viewForKey:)]) {
fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
toView = [transitionContext viewForKey:UITransitionContextToViewKey];
} else {
fromView = fromViewController.view;
toView = toViewController.view;
}
transView = toView;
[[transitionContext containerView] addSubview:toView];
transView.transform = CGAffineTransformMakeScale(0, 0);
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
transView.transform = CGAffineTransformMakeScale(1.0, 1.0);
} completion:^(BOOL finished) {
[transitionContext completeTransition:!transitionContext.transitionWasCancelled];
}];
}
UIViewControllerTransitioningDelegate
UIViewController
在執(zhí)行present
,dismiss
時(shí)菠净,通過實(shí)現(xiàn) UIViewControllerTransitioningDelegate
來添加自定義動(dòng)畫,UIViewControllerTransitioningDelegate
包括以下4個(gè)方法:
//指定present動(dòng)畫
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
//指定dismiss動(dòng)畫
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;
//指定交互式present動(dòng)畫的控制類
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator;
//指定交互式dismiss動(dòng)畫的控制類
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator;
UINavigationControllerDelegate
UIViewController
在執(zhí)行push
,pop
時(shí),通過實(shí)現(xiàn) UINavigationControllerDelegate
來添加自定義動(dòng)畫嗤练,通過以下方法來具體的動(dòng)畫:
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC
具體的代碼可以在demo中查看。自定義轉(zhuǎn)場動(dòng)畫的代碼在CATransition
目錄下在讶。
個(gè)人博客