简介

VCTransitionsLibrary
提供了好多适用于入栈,出栈,模态等景观下控制器切换时的转场动画.它自身提供了一个概念好的转场动画库,你可以拖到自己工程中直接选取;也提供了累累有着分化转场动画效果”互动控制器”,你可以直接行使那么些控制器来和自定义动画效果格外使用;而不是友善主宰去决定交互.

项目主页: VCTransitionsLibrary

摩登示例: 点击下载

注意: 自定义视图控制器的转场动画为iOS7 +
经过 UIViewControllerTransitioningDelegate协议, UINavigationControllerDelegate研讨和 UITabBarControllerDelegate
协议提供的系统级其他协助.这些库的意思在于定义了常用的卡通片效果,并封装了常用的竞相操作,简化了iOS交互式转场动画的编码量!

火速入门

运转条件

  • iOS 7+
  • ARC

安装

使用 CocoaPods 安装

pod "VCTransitionsLibrary"

2018正版葡京赌侠诗,手动安装

把文件 AnimationControllers 和 InteractionControllers 文件夹下所有代码复制到工程中即可.

使用

在自定义转场动画时,有两类首要的类:

  • 动画片控制器 –
     那个类是用来促成自定义动画的.但你申明想要使用自定义动画时,你应有提供一个动画控制器.那么些类会完结需求的动画片,落成时会公告框架.
  • 互相之间控制器 –
    这几个类是用来管理相互的-那么些平日由某个手势空控制的交互,允许用户通过滑行,轻扫或施行其余操作来贯彻八个视图控制器的导航.必须提议的是,交互控制器允许导航撤消,例如,一个用户可以在正在导航至某一页面时,突然更改主意,然后打消了操作.

瞩目: 动画和互动是一心独立的,这意味你可以在此外任何自定义控制器上独立运用交互控制器-很酷!

应用动画片控制器

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图