代码库> 视图动画> VCTransitionsLibrary——View Controller转场效果库
VCTransitionsLibrary——View Controller转场效果库
关注
查看次数:10619 下载次数:607
上传时间:2013-10-14 大小:8 KB
使用iOS 7你可以很简单的创建定制的view controller转场效果,它们可以在很多情境中使用。本工程提供一个定制的转场效果库,你可以直接将他们添加到工程中。同时本工程还有一些interaction controller,它们可以和任一定制的动画一起使用,这样可以让转场变的有互动性。

测试环境:Xcode5.0 测试,iOS 5.0以上

现在这个库含有以下的效果内容,可以通过滑动或者捏的手势进行交互。
 

简要介绍定制转场效果

定制转场效果有两个关键的类:

Animation Controller——这个类别负责定制转场效果。当你需要发出指示说明这个定制的转场效果该如何使用,你需要提供一个animation controller。这个类会运行所需的动画,然后当动画完成后会通知框架。

Interaction Controller——这个类负责过渡的交互——这些过渡通常都被一个手势控制。有一点很重要的就是,interaction可以取消过渡的进行,比如说,一个用户可以开始导航,但是突然改变了主要,用户可以取消。

注意:animation controller和interaction controller是完全相互独立的。这就是说任意的animation controller和interaciton controller可以相互组合。

添加定制转场效果到工程

使用方法

1.Cocoapods:将下行添加到Podfile:pod 'VCTransitionsLibrary', '~> 1.1.0'

2.手动添加。如果不使用Cocoapods的话,可以复制所需的文件到工程中。AnimationControllers 以及InteractionControllers 文件夹中包含了所有需要的代码。

使用一个animation controller
AnimationControllers文件夹中包含了一些animate controller,你可以按照下列方法将转场动画添加到工程中去

定制转场效果的出现和消失
UIViewControllerTransitioningDelegate协议被用来支持animation controller让转场效果的出现或者消失。当一个view controller出现或者消失的时候,view controller的transitioningDelegate 属性会被用来支持这个delegate。只需要返回animation controller来回应下列 消息:

animationControllerForPresentedController: presentingController: sourceController:
这条消息代表让效果出现。

animationControllerForDismissedController:这条消息代表让效果消失

定制navigation controller 转场效果
UINavigationControllerDelegate协议中有可以用来提供animation controller的方法。只需要回复navigationController: animationControllerForOperation: fromViewController: toViewController:来返回一个animation controller。

这个库的所有的animation controllers都有一个子类:CEReversibleAnimationController,它会让你随时取消转场。用法如下:




- (id)navigationController:
                                (UINavigationController *)navigationController
   animationControllerForOperation:(UINavigationControllerOperation)operation
                fromViewController:(UIViewController *)fromVC
                  toViewController:(UIViewController *)toVC {


    // reverse the animation for 'pop' transitions
    _animationController.reverse = operation == UINavigationControllerOperationPop;


    return _animationController;
}









定制tab barcontroller转场效果


UITabBarControllerDelegate协议有可以用来提供animation controllers的方法。只要回复tabBarController: animationControllerForTransitionFromViewController: toViewController:返回一个animation controller。


为了确定animation方向,你可以如下所示比较两个view controller的index。





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





使用interaction controller
interaction controller和animation controller一起工作让转场效果具有交互性,也就是说允许用户使用手势控制转场效果。interaction controller负责添加手势辨识器添加到view上,识别用户手势。

让转场效果消失
UIViewControllerTransitioningDelegate这个用来支持animation controller的协议同样可以用来支持interaciton controller。下面的代码演示了使用一个滑动的手势出现翻转的动画:




// instance variables, typically instantiated in your init method
CEFlipAnimationController *_animationController;
CESwipeInteractionController *_interactionController;




- (id)
      animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source {


    // allow the interaction controller to wire-up its gesture recognisers
    [_interactionController wireToViewController:presented 
                                    forOperation:CEInteractionOperationDismiss];
       _animationController.reverse = NO;
    return _animationController;
}


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


- (id)
           interactionControllerForDismissal:
                (id)animator {

    // provide the interaction controller, if an interactive transition is in progress
    return _interactionController.interactionInProgress
                ? _interactionController : nil;
}



注意上面的代码检查了interactionInProgress 属性。这是因为你可能希望让用户使用一个按钮或者一个手势可以让view controller小时。同时你需要告诉interaction controller需要进行这个操作(比如说弹出,或者消失)。

让转场动画出现
UINavigationControllerDelegate协议也有方法用来返回interaction controllers。见以下代码:




// instance variables, typically instantiated in your init method
CEFlipAnimationController *_animationController;
CESwipeInteractionController *_interactionController;


- (id)
                 navigationController:(UINavigationController *)navigationController
      animationControllerForOperation:(UINavigationControllerOperation)operation
                   fromViewController:(UIViewController *)fromVC
                     toViewController:(UIViewController *)toVC {


    // wire the interaction controller to the to- view controller
    [_interactionController wireToViewController:toVC
                                    forOperation:CEInteractionOperationPop];

    _animationController.reverse = operation == UINavigationControllerOperationPop;


    return _animationController.reverse;
}


- (id )
                         navigationController:(UINavigationController *)navigationController 
  interactionControllerForAnimationController:(id )animationController {


    // provide the interaction controller, if an interactive transition is in progress
    return _interactionController.interactionInProgress
                ? _interactionController : nil;
}






tab转场效果


UITabBarControllerDelegate协议也有一个方法用来返回interactions controllers。和上面的navigation controller的例子类似,interaction controller 需要给view controller添加一个手势识别器。但是不幸的是当第一个view controller出现的时候tab bar的delegate方法不会启动,所以我使用了Key-Value Observing来实现它。


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

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        self.delegate = self;

        // create the interaction / animation controllers
        _swipeInteractionController = [CESwipeInteractionController new];
        _animationController = [CEFoldAnimationController new];
        _animationController.folds = 3;

        // observe changes in the currently presented view controller
        [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"] )
    {
        // wire the interaction controller to the view controller
        [_swipeInteractionController wireToViewController:self.selectedViewController
                                             forOperation:CEInteractionOperationTab];
    }
}





编注:接上段代码。


折叠效果——CEFoldAnimationController
 

翻页效果——CEFlipAnimationController
 

翻转效果——CETurnAnimationController
 

淡入淡出效果——CECrossfadeAnimationController
 


爆炸效果—— CEExplodeAnimationController
 

卡片效果—— CECardsAnimationController
 


下载:  

收藏
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0


综合评论
提示
sina weixin mail 回到顶部