VCTransitionsLibrary –自定义iOS交互式转场动画的库管理

自定义模态控制器显示/隐藏的卡通片

UIViewControllerTransitioningDelegate
切磋被用来在模态控制器彰显/隐藏时提供叁个卡通控制器.当二个视图控制器被模态呈现或隐藏时,它的transitioningDelegate属性用来提供UIViewControllerTransitioningDelegate协议的协助.担当代理剧中人物的类,通过 animationControllerForPresentedController:
presentingController: sourceController: 方法重回模态展现时的卡通,
通过 animationControllerForDismissedController: 返回模态消失时的动画即可.

入门

行使交互控制器

相互控制器和动画片控制器合作使用,能够兑现交互式的卡通转场效果,比如可以让用户通过手势来支配页面间的导航.交互控制器允许用户在三个转场动画中进步,后退,甚至退出.

交互控制器负责给视图添加手势,并担负在用户采取有些手势时开始展览相应地导航操作.

基本功动画

基础动画能够用来在钦赐的岁月段动态改变属性的值.在默许的小时周期内动态让视图的反射率从0.0变化到1.0来完毕淡入的效应:

POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.fromValue = @(0.0);
anim.toValue = @(1.0);
[view pop_addAnimation:anim forKey:@"fade"];

模态控制器消失时的互动

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;
}

通过CocoaPods安装

pod 'pop', '~> 1.0'

自定义尾部标签栏导航的转场动画

UITabBarController 有二个 id<UITabBarControllerDelegate>
delegate属性,只需求让它的代理通过tabBarController:
animationControllerForTransitionFromViewController:
toViewController:重临某些动画效果即可.

为了给动画1个格外的自由化,你能够相比较三个视图控制器的目录:

- (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;
}

安装

自定义顶部导航的转场动画

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;
}

自定义动画

POPCustomAnimation 用来创建自定义动画和联网效果.它经过管住
CADisplayLink 来保管时间与动画片的涉及性.更加多细节,详见头文件.

飞快入门

管理 1

用来标签栏控制器切换时的竞相

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

简介

Pop
是三个可增加的卡通片引擎,可用于贯彻任意iOS对象的任意属性的动态变化,帮衬一般动画,弹性动画和潜移默化动画三连串型.

  • 类型主页: pop

  • 新式示例: 点击下载

  • 瞩目:
    官方代码中,并不含有实例,而是用于编写翻译的具有源代码,提出活动新建筑工程程,并整合下文的代码片段查看效果.

运营条件

  • iOS 7+
  • ARC

弹性动画

弹性动画,能够给目的一个有精力的弹跳效果.上面的例子中,大家应用弹性动画来使图层的边框值从它的当前值变化为(0,
0 ,400, 400):

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];

出栈时的并行

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;
}

动画的起来,截至 与 更新

把动画添加到你想要拥有动态变化的对象方面,即可初步动画:

POPSpringAnimation *anim = [POPSpringAnimation animation];
...
[layer pop_addAnimation:anim forKey:@"myKey"];

能够根据先河动画时传出的键,来移除对应的卡通片:

[layer pop_removeAnimationForKey:@"myKey"];

开头动画时传出的键,也足以用来询问是还是不是留存某些动画.更新一个正在实行的动画片的
toValue,能够无缝达成动画效果间的联网:

anim = [layer pop_animationForKey:@"myKey"];
if (anim) {
  /* 更新toValue为一个新值. */
  anim.toValue = @(42.0);
} else {
  /* 创建并开始一个新的动画. */
  ....
}

地点的例证是以图层为例.Pop是以NSObject的扩大格局实现的.也正是说:
任何NSObject及其子类都得以通过Pop添加动画效果.

使用

在自定义转场动画时,有两类重点的类:

  • 动画控制器 –
     这一个类是用来兑现自定义动画的.但你注解想要使用自定义动画时,你应有提供一个动画控制器.那个类会实现供给的动画,实现时会公告框架.
  • 相互之间控制器 –
    这一个类是用来保管相互的-那多少个经常由有些手势空控制的相互,允许用户通过滑行,轻扫或施行别的操作来落到实处多少个视图控制器的导航.必须提议的是,交互控制器允许导航撤废,例如,一个用户能够在正在导航至某一页面时,突然改变主意,然后撤销了操作.

小心: 动画和相互是全然独立的,那象征你能够在此外任何自定义控制器上独立行使交互控制器-很酷!

使用

在急需选择POP的地方,引入头文件:

#import <pop/POP.h>

简介

VCTransitionsLibrary
提供了过多适用于入栈,出栈,模态等场景下控制器切换时的转场动画.它本人提供了三个定义好的转场动画库,你能够拖到自身工程中央直机关接采纳;也提供了好多具有差异转场动画效果”互动控制器”,你能够直接行使这一个控制器来和自定义动画效果万分使用;而不是和谐支配去决定交互.

项目主页: VCTransitionsLibrary

新式示例: 点击下载

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

动画片属性

动画属性由POPAnimatableProperty类管理,用来钦命在哪些属性上行使动画效果.在下边包车型客车事例中,大家创制了四个弹性动画,并且展现设置动画属性为与-[CALayer bounds]相应的属性:

POPSpringAnimation *anim = [POPSpringAnimation animation];
anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];

其一框架爱预先达成了了许多图层和视图共用的动画属性,你能够在友好的连串中一直使用.你也得以通过创办POPAnimatableProperty类的实例,来创设二个自定义的动画片属性.下边包车型地铁例证中,大家定义了三个自定义的volume动画属性:

prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) {
  // 读取动画属性的值
  prop.readBlock = ^(id obj, CGFloat values[]) {
    values[0] = [obj volume];
  };
  // 设置动画属性的值.
  prop.writeBlock = ^(id obj, const CGFloat values[]) {
    [obj setVolume:values[0]];
  };
  // 力学上的临界值
  prop.threshold = 0.01;
}];

anim.property = prop;

系统预订义的卡通属性也是由地点例子的编写制定定义的,自定义动画属性时,很有借鉴价值.完整的预约义的动画片属性列表和她们实现的有血有肉细节参见POPAnimatableProperty.h:

/**
 图层(CALayer)通用动画属性.
 */
extern NSString * const kPOPLayerBackgroundColor;
extern NSString * const kPOPLayerBounds;
extern NSString * const kPOPLayerCornerRadius;
extern NSString * const kPOPLayerBorderWidth;
extern NSString * const kPOPLayerBorderColor;
extern NSString * const kPOPLayerOpacity;
extern NSString * const kPOPLayerPosition;
extern NSString * const kPOPLayerPositionX;
extern NSString * const kPOPLayerPositionY;
extern NSString * const kPOPLayerRotation;
extern NSString * const kPOPLayerRotationX;
extern NSString * const kPOPLayerRotationY;
extern NSString * const kPOPLayerScaleX;
extern NSString * const kPOPLayerScaleXY;
extern NSString * const kPOPLayerScaleY;
extern NSString * const kPOPLayerSize;
extern NSString * const kPOPLayerSubscaleXY;
extern NSString * const kPOPLayerSubtranslationX;
extern NSString * const kPOPLayerSubtranslationXY;
extern NSString * const kPOPLayerSubtranslationY;
extern NSString * const kPOPLayerSubtranslationZ;
extern NSString * const kPOPLayerTranslationX;
extern NSString * const kPOPLayerTranslationXY;
extern NSString * const kPOPLayerTranslationY;
extern NSString * const kPOPLayerTranslationZ;
extern NSString * const kPOPLayerZPosition;
extern NSString * const kPOPLayerShadowColor;
extern NSString * const kPOPLayerShadowOffset;
extern NSString * const kPOPLayerShadowOpacity;
extern NSString * const kPOPLayerShadowRadius;

/**
 图形层(CAShapeLayer)通用动画属性.
  */
extern NSString * const kPOPShapeLayerStrokeStart;
extern NSString * const kPOPShapeLayerStrokeEnd;
extern NSString * const kPOPShapeLayerStrokeColor;
extern NSString * const kPOPShapeLayerFillColor;

/**
 视图约束(NSLayoutConstraint)通用动画属性.
  */
extern NSString * const kPOPLayoutConstraintConstant;

/**
 视图(UIView)通用动画属性.
 */
extern NSString * const kPOPViewAlpha;
extern NSString * const kPOPViewBackgroundColor;
extern NSString * const kPOPViewBounds;
extern NSString * const kPOPViewCenter;
extern NSString * const kPOPViewFrame;
extern NSString * const kPOPViewScaleX;
extern NSString * const kPOPViewScaleXY;
extern NSString * const kPOPViewScaleY;
extern NSString * const kPOPViewSize;
extern NSString * const kPOPViewTintColor;

/**
 滚动视图(UIScrollView)通用动画属性.
 */
extern NSString * const kPOPScrollViewContentOffset;
extern NSString * const kPOPScrollViewContentSize;
extern NSString * const kPOPScrollViewZoomScale;
extern NSString * const kPOPScrollViewContentInset;

/**
 列表(UITableView)通用动画属性.
 */
extern NSString * const kPOPTableViewContentOffset;
extern NSString * const kPOPTableViewContentSize;

/**
 集合视图(UICollectionView)通用动画属性.
 */
extern NSString * const kPOPCollectionViewContentOffset;
extern NSString * const kPOPCollectionViewContentSize;

/**
 导航栏(UINavigationBar)通用动画属性.
 */
extern NSString * const kPOPNavigationBarBarTintColor;

/**
 工具栏(UIToolBar)通用动画属性.
 */
extern NSString * const kPOPToolbarBarTintColor;

/**
 标签栏(UITabBar)通用动画属性.
 */
extern NSString * const kPOPTabBarBarTintColor;

/**
 标签(UILabel)通用动画属性.
 */
extern NSString * const kPOPLabelTextColor;

使用 CocoaPods 安装

pod "VCTransitionsLibrary"

卡通类型

有七种动画类型: 弹性动画,渐弱动画,基础动画和自定义动画.

手动安装

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

潜移默化动画

潜移默化动画,能够让对象缓慢地平息变化.上面包车型地铁例子,我们使图层的横坐标从当前值以一千像素每秒的进程渐变:

POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.velocity = @(1000.);
[layer pop_addAnimation:anim forKey:@"slide"];

选择动画片控制器

AnimationControllers 文件夹中提供了比比皆是得以组成进你的工程中的动画控制器:

安装

Post Author: admin

发表评论

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