iOS7中引入了控制器間的切換切換動畫,適用于UINavigationController棧內(nèi)核modal顯示
iOS7 介紹了兩種切換方式,一種是自動切換,另一種是交互式切換。下面就介紹一下NavigationController中實現(xiàn)fade動畫切換。
在動畫的世界里面充滿了協(xié)議,然而現(xiàn)在這個項目中創(chuàng)建一個我們想要看見的視圖,添加的協(xié)議需要交互式切換和模態(tài)視圖的展現(xiàn)。
UINavigationControllerDelegate協(xié)議提供了4個新方法,用來決定自定義動畫的切換。
我們感興趣的方法是:
- (id<UIViewControllerAnimatedTransitioning>)navigationController: animationControllerForOperation: fromViewController: toViewController:
這個方法將會在導(dǎo)航控制器切換過度的時候調(diào)用(同樣適用于storyboard適用segue的過度),所以我們可以決定返回哪種類型的切換。
我們創(chuàng)建一個類作為NavigationController的delegate
@interface SCNavControllerDelegate : NSObject <UINavigationControllerDelegate>@end
實現(xiàn)方法是:
@implementation SCNavControllerDelegate - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { return [SCFadeTransition new]; }@end
我們想要所有的切換都是相同的,不管是進入還是返回,所以我們返回的是SCFadeTransition對象給每一次切換。
設(shè)置代理是非常見到你的,你可以在項目里面看見:
- (id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if(self) { _navDelegate = [SCNavControllerDelegate new]; self.delegate = _navDelegate; } return self;}
_navDelegate 是一個ivar類型id<UINavigationControllerDelegate>.
創(chuàng)建自定義變換
我們看見這個代理需要返回一些切換對象,也就是返回一個遵循UIViewControllerAnimatedTransitioning協(xié)議的對象,這個協(xié)議中有三個方法,其中兩個是必須要實現(xiàn)的。
transitionDuration:(必須實現(xiàn))。返回動畫的持續(xù)時間
animateTransition:(必須實現(xiàn))在控制器間實現(xiàn)動畫的過度。提供一個我們需要的對象用來聯(lián)系不同的組件。
animationEnded:(選擇實現(xiàn))這個會在動畫完成之后調(diào)用,可以在動畫完成之后觸發(fā)一些方法。
我們定義一個SCFadeTransition類來實現(xiàn)這兩個方法
@interface SCFadeTransition : NSObject <UIViewControllerAnimatedTransitioning>@end
實現(xiàn)方法如下
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{ return 2.0;}
當animateTransition:方法調(diào)用的時候提供一個遵循UIViewControllerContextTransitioning協(xié)議的對象,這個對象用來獲取動畫完成的點點滴滴。第一個方法我們用 viewControllerForKey:,讓我們能夠掌握兩個視圖控制器間的過度。
// Get the two view controllersUIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
這個內(nèi)容提供給我們一個UIView的動畫,通過containerView方法聯(lián)系
// Get the container view - where the animation has to happenUIView *containerView = [transitionContext containerView];
我們必須聯(lián)系每一個視圖控制器的子視圖
// Add the two VC views to the container[containerView addSubview:fromVC.view];[containerView addSubview:toVC.view];
我們不想看見過度的視圖,所以我們必須把alpha屬性設(shè)置為0:
toVC.view.alpha = 0.0;現(xiàn)在我們已經(jīng)提供了一個動畫,在控制器間切換有個簡單的fade效果,我們可以用UIView animation block:
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 options:0 animations:^{ toVC.view.alpha = 1.f; } completion:^(BOOL finished) { // Let's get rid of the old VC view [fromVC.view removeFromSuperview]; // And then we need to tell the context that we're done [transitionContext completeTransition:YES]; }];
知識點:
1、設(shè)置一個動畫的持續(xù)時間,實現(xiàn)transitionDuration
2、"from"視圖控制器的視圖需要removed從view的層級中,當動畫完成的時候。
3、completeTransition:方法在切換內(nèi)容需要的時候調(diào)用,當動畫完成的時候。



新聞熱點
疑難解答