VCTransitionsLibrary –自定義iOS交互式轉場動畫的庫

簡介

VCTransitionsLibrary 提供了許多適用於入棧,出棧,模態等場景下控制器切換時的轉場動畫.它自己提供了一個定義好的轉場動畫庫,你能夠拖到本身工程中直接使用;也提供了許多擁有不一樣轉場動畫效果」互動控制器」,你能夠直接使用這些控制器來和自定義動畫效果配合使用;而不是本身控制去控制交互.ios

項目主頁: VCTransitionsLibrarygit

最新示例: 點擊下載github

注意: 自定義視圖控制器的轉場動畫爲iOS7 + 經過 UIViewControllerTransitioningDelegate協議, UINavigationControllerDelegate協議和 UITabBarControllerDelegate 協議提供的系統級別的支持.這個庫的意義在於定義了經常使用的動畫效果,並封裝了經常使用的交互操做,簡化了iOS交互式轉場動畫的編碼量!框架

快速入門

運行環境

  • iOS 7+動畫

  • ARC編碼

安裝

使用 CocoaPods 安裝

pod "VCTransitionsLibrary"

手動安裝

把文件 AnimationControllers 和 InteractionControllers 文件夾下全部代碼複製到工程中便可.spa

使用

在自定義轉場動畫時,有兩類關鍵的類:代理

  • 動畫控制器 –  這個類是用來實現自定義動畫的.但你聲明想要使用自定義動畫時,你應該提供一個動畫控制器.這個類會實現須要的動畫,完成時會通知框架.code

  • 交互控制器 – 這個類是用來管理交互的-那些一般由某個手勢空控制的交互,容許用戶經過滑動,輕掃或執行其餘操做來實現兩個視圖控制器的導航.必須指出的是,交互控制器容許導航取消,例如,一個用戶能夠在正在導航至某一頁面時,忽然改變主意,而後取消了操做.orm

注意: 動畫和交互是徹底獨立的,這意味着你能夠在其餘任何自定義控制器上獨立使用交互控制器-很酷!

使用動畫控制器

AnimationControllers 文件夾中提供了許多能夠整合進你的工程中的動畫控制器:

自定義模態控制器顯示/隱藏的動畫

UIViewControllerTransitioningDelegate 協議被用來在模態控制器顯示/隱藏時提供一個動畫控制器.當一個視圖控制器被模態顯示或隱藏時,它的transitioningDelegate屬性用來提供UIViewControllerTransitioningDelegate協議的支持.擔當代理角色的類,經過 animationControllerForPresentedController: presentingController: sourceController: 方法返回模態顯示時的動畫, 經過 animationControllerForDismissedController: 返回模態消失時的動畫便可.

自定義頂部導航的轉場動畫

UINavigationController 有一個

id<UINavigationControllerDelegate> delegate 屬性.只須要讓它的代理經過 navigationController: animationControllerForOperation: fromViewController: toViewController: 返回某個動畫效果便可.

爲了同時設置出棧/入棧都合適的動畫效果(或者說,出棧/入棧時能使用相反方向的動畫),你能夠參考下面代碼:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:
                                (UINavigationController *)navigationController
   animationControllerForOperation:(UINavigationControllerOperation)operation
                fromViewController:(UIViewController *)fromVC
                  toViewController:(UIViewController *)toVC {    // 出棧時,要反轉動畫方向.    _animationController.reverse = operation == UINavigationControllerOperationPop;    return _animationController;
}

自定義底部標籤欄導航的轉場動畫

UITabBarController 有一個 id<UITabBarControllerDelegate> delegate屬性,只須要讓它的代理經過tabBarController: animationControllerForTransitionFromViewController: toViewController:返回某個動畫效果便可.

爲了給動畫一個合適的方向,你能夠比較兩個視圖控制器的索引:

- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
            animationControllerForTransitionFromViewController:(UIViewController *)fromVC
                                              toViewController:(UIViewController *)toVC {    NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];    NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];

    _animationController.reverse = fromVCIndex < toVCIndex;    return _animationController;
}

使用交互控制器

交互控制器和動畫控制器配合使用,能夠實現交互式的動畫轉場效果,好比可讓用戶經過手勢來控制頁面間的導航.交互控制器容許用戶在一個轉場動畫中前進,後退,甚至退出.

交互控制器負責給視圖添加手勢,並負責在用戶使用某個手勢時進行相應地導航操做.

模態控制器消失時的交互

UIViewControllerTransitioningDelegate 協議,也用來提供對交互式轉場的支持.下面是一個結合清掃手勢和翻頁動畫的例子:

//實例變量,一般在你的初始化方法初始化它們CEFlipAnimationController *_animationController;
CESwipeInteractionController *_interactionController;

- (id<UIViewControllerAnimatedTransitioning>)
      animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source {    // 容許交互控制器綁定它的手勢識別器.
    [_interactionController wireToViewController:presented 
                                    forOperation:CEInteractionOperationDismiss];
       _animationController.reverse = NO;    return _animationController;
}

- (id<UIViewControllerAnimatedTransitioning>)
     animationControllerForDismissedController:(UIViewController *)dismissed {
    _animationController.reverse = YES;    return _animationController;
}

- (id<UIViewControllerInteractiveTransitioning>)
           interactionControllerForDismissal:
                (id<UIViewControllerAnimatedTransitioning>)animator {    // 若是有交互控制器被觸發了,就直接使用它.返回nil,是爲了支持用戶經過點擊某個按鈕直接返回;此時不會觸發交互控制器.
    return _interactionController.interactionInProgress
                ? _interactionController : nil;
}

出棧時的交互

UINavigationControllerDelegate 也有方法爲交互式轉場提供支持.一個典型的相似於上上面代碼的模式:

// 實例變量,一般在你的初始化方法中初始化它們.CEFlipAnimationController *_animationController;
CESwipeInteractionController *_interactionController;

- (id<UIViewControllerAnimatedTransitioning>)
                 navigationController:(UINavigationController *)navigationController
      animationControllerForOperation:(UINavigationControllerOperation)operation
                   fromViewController:(UIViewController *)fromVC
                     toViewController:(UIViewController *)toVC {    // 把交互控制器綁定到你的視圖控制器上.
    [_interactionController wireToViewController:toVC                                    forOperation:CEInteractionOperationPop];

    _animationController.reverse = operation == UINavigationControllerOperationPop;    return _animationController;
}

- (id <UIViewControllerInteractiveTransitioning>)
                         navigationController:(UINavigationController *)navigationController 
  interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>)animationController {    //若是有交互控制器被觸發了,就直接使用它.返回nil,是爲了支持用戶經過點擊某個按鈕直接返回;此時不會觸發交互控制器.     return _interactionController.interactionInProgress
                ? _interactionController : nil;
}

用於標籤欄控制器切換時的交互

UITabBarControllerDelegate 協議也爲交互式轉場提供了支持.可是因爲代理方法在首次初始化時不被執行,全部須要其餘方式來綁定交互控制器,如KVO:

@implementation TabBarViewController {
    CEFoldAnimationController *_animationController;
    CESwipeInteractionController *_swipeInteractionController;
}

- (id)initWithCoder:(NSCoder *)aDecoder {    if (self = [super initWithCoder:aDecoder]) {
        self.delegate = self;        // 建立交互/動畫控制器.
        _swipeInteractionController = [CESwipeInteractionController new];
        _animationController = [CEFoldAnimationController new];
        _animationController.folds = 3;        // 使用觀察者模式監測被選中的選擇器的變化狀況.
        [self addObserver:self
               forKeyPath:@"selectedViewController"
                  options:NSKeyValueObservingOptionNew                  context:nil];
    }    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context{    if ([keyPath isEqualToString:@"selectedViewController"] )
    {        // 把交互控制器綁定到視圖控制器上.
        [_swipeInteractionController wireToViewController:self.selectedViewController                                             forOperation:CEInteractionOperationTab];
    }
}



- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
            animationControllerForTransitionFromViewController:(UIViewController *)fromVC
                                              toViewController:(UIViewController *)toVC {    NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];    NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];

    _animationController.reverse = fromVCIndex < toVCIndex;    return _animationController;
}

-(id<UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController{    return _swipeInteractionController.interactionInProgress ? _swipeInteractionController : nil;
}@end
相關文章
相關標籤/搜索