[
  {
    "path": ".gitignore",
    "content": "#########################\n# .gitignore file for Xcode4 / OS X Source projects\n#\n# Version 2.0\n#    For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects\n#\n# 2013 updates:\n#    - fixed the broken \"save personal Schemes\"\n#\n# NB: if you are storing \"built\" products, this WILL NOT WORK,\n#   and you should use a different .gitignore (or none at all)\n# This file is for SOURCE projects, where there are many extra\n#   files that we want to exclude\n#\n#########################\n\n#####\n# OS X temporary files that should never be committed\n\n.DS_Store\n*.swp\n*.lock\nprofile\n\n\n####\n# Xcode temporary files that should never be committed\n# \n# NB: NIB/XIB files still exist even on Storyboard projects, so we want this...\n\n*~.nib\n\n\n####\n# Xcode build files -\n#\n# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named \"DerivedData\"\n\nDerivedData/\n\n# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named \"build\"\n\nbuild/\n\n\n#####\n# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups)\n#\n# This is complicated:\n#\n# SOMETIMES you need to put this file in version control.\n# Apple designed it poorly - if you use \"custom executables\", they are\n#  saved in this file.\n# 99% of projects do NOT use those, so they do NOT want to version control this file.\n#  ..but if you're in the 1%, comment out the line \"*.pbxuser\"\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n#    NB: also, whitelist the default ones, some projects need to use these\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\n\n####\n# Xcode 4 - semi-personal settings\n#\n#\n# OPTION 1: ---------------------------------\n#     throw away ALL personal settings (including custom schemes!\n#     - unless they are \"shared\")\n#\n# NB: this is exclusive with OPTION 2 below\nxcuserdata\n\n# OPTION 2: ---------------------------------\n#     get rid of ALL personal settings, but KEEP SOME OF THEM\n#     - NB: you must manually uncomment the bits you want to keep\n#\n# NB: this is exclusive with OPTION 1 above\n#\n#xcuserdata/**/*\n\n#     (requires option 2 above): Personal Schemes\n#\n#!xcuserdata/**/xcschemes/*\n\n####\n# XCode 4 workspaces - more detailed\n#\n# Workspaces are important! They are a core feature of Xcode - don't exclude them :)\n#\n# Workspace layout is quite spammy. For reference:\n#\n# /(root)/\n#   /(project-name).xcodeproj/\n#     project.pbxproj\n#     /project.xcworkspace/\n#       contents.xcworkspacedata\n#       /xcuserdata/\n#         /(your name)/xcuserdatad/\n#           UserInterfaceState.xcuserstate\n#     /xcsshareddata/\n#       /xcschemes/\n#         (shared scheme name).xcscheme\n#     /xcuserdata/\n#       /(your name)/xcuserdatad/\n#         (private scheme).xcscheme\n#         xcschememanagement.plist\n#\n#\n\n####\n# Xcode 4 - Deprecated classes\n#\n# Allegedly, if you manually \"deprecate\" your classes, they get moved here.\n#\n# We're using source-control, so this is a \"feature\" that we do not want!\n\n*.moved-aside\n\n####\n# Cocoapods: cocoapods.org\n# \n# Ignoring these files means that whoever uses the code will first have to run:\n# pod install\n# in the App.xcodeproj directory.\n# This ensures the latest dependencies are used.\nPods/\nPodfile.lock\n\n\n####\n# UNKNOWN: recommended by others, but I can't discover what these files are\n#\n# ...none. Everything is now explained.\nTransitionsDemo.xccheckout\n"
  },
  {
    "path": "AnimationControllers/CECardsAnimationController.h",
    "content": "//\n//  CEZoomAnimationController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 22/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n@interface CECardsAnimationController : CEReversibleAnimationController\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CECardsAnimationController.m",
    "content": "//\n//  CEZoomAnimationController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 22/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CECardsAnimationController.h\"\n\n@implementation CECardsAnimationController\n\n\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    if(self.reverse){\n        [self executeReverseAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView];\n    } else {\n        [self executeForwardsAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView];\n    }\n    \n}\n\n-(void)executeForwardsAnimation:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    UIView* containerView = [transitionContext containerView];\n    \n    // positions the to- view off the bottom of the sceen\n    CGRect frame = [transitionContext initialFrameForViewController:fromVC];\n    CGRect offScreenFrame = frame;\n    offScreenFrame.origin.y = offScreenFrame.size.height;\n    toView.frame = offScreenFrame;\n    \n    [containerView insertSubview:toView aboveSubview:fromView];\n    \n    CATransform3D t1 = [self firstTransform];\n    CATransform3D t2 = [self secondTransformWithView:fromView];\n    \n    [UIView animateKeyframesWithDuration:self.duration delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{\n        \n        // push the from- view to the back\n        [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:0.4f animations:^{\n            fromView.layer.transform = t1;\n            fromView.alpha = 0.6;\n        }];\n        [UIView addKeyframeWithRelativeStartTime:0.2f relativeDuration:0.4f animations:^{\n            fromView.layer.transform = t2;\n        }];\n\n        // slide the to- view upwards. In his original implementation Tope used a 'spring' animation, however\n        // this does not work with keyframes, so we siulate it by overshooting the final location in\n        // the first keyframe\n        [UIView addKeyframeWithRelativeStartTime:0.6f relativeDuration:0.2f animations:^{\n            toView.frame = CGRectOffset(toView.frame, 0.0, -30.0);\n        }];\n        [UIView addKeyframeWithRelativeStartTime:0.8f relativeDuration:0.2f animations:^{\n            toView.frame = frame;\n        }];\n\n    } completion:^(BOOL finished) {\n        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n    }];\n    \n    \n}\n\n-(void)executeReverseAnimation:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    UIView* containerView = [transitionContext containerView];\n    \n    // positions the to- view behind the from- view\n    CGRect frame = [transitionContext initialFrameForViewController:fromVC];\n    toView.frame = frame;\n    CATransform3D scale = CATransform3DIdentity;\n    toView.layer.transform = CATransform3DScale(scale, 0.6, 0.6, 1);\n    toView.alpha = 0.6;\n    \n    [containerView insertSubview:toView belowSubview:fromView];\n    \n    CGRect frameOffScreen = frame;\n    frameOffScreen.origin.y = frame.size.height;\n    \n    CATransform3D t1 = [self firstTransform];\n    \n    [UIView animateKeyframesWithDuration:self.duration delay:0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{\n\n        // push the from- view off the bottom of the screen\n        [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:0.5f animations:^{\n            fromView.frame = frameOffScreen;\n        }];\n        \n        // animate the to- view into place\n        [UIView addKeyframeWithRelativeStartTime:0.35f relativeDuration:0.35f animations:^{\n            toView.layer.transform = t1;\n            toView.alpha = 1.0;\n        }];\n        [UIView addKeyframeWithRelativeStartTime:0.75f relativeDuration:0.25f animations:^{\n            toView.layer.transform = CATransform3DIdentity;\n        }];\n    } completion:^(BOOL finished) {\n        if ([transitionContext transitionWasCancelled]) {\n            toView.layer.transform = CATransform3DIdentity;\n            toView.alpha = 1.0;\n        }\n        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n    }];\n}\n\n-(CATransform3D)firstTransform{\n    CATransform3D t1 = CATransform3DIdentity;\n    t1.m34 = 1.0/-900;\n    t1 = CATransform3DScale(t1, 0.95, 0.95, 1);\n    t1 = CATransform3DRotate(t1, 15.0f * M_PI/180.0f, 1, 0, 0);\n    return t1;\n    \n}\n\n-(CATransform3D)secondTransformWithView:(UIView*)view{\n    \n    CATransform3D t2 = CATransform3DIdentity;\n    t2.m34 = [self firstTransform].m34;\n    t2 = CATransform3DTranslate(t2, 0, view.frame.size.height*-0.08, 0);\n    t2 = CATransform3DScale(t2, 0.8, 0.8, 1);\n    \n    return t2;\n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CECrossfadeAnimationController.h",
    "content": "//\n//  CECrossfadeAnimationController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 11/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/**\n Animates between the two view controllers by performing a simple cross-fade. \n */\n@interface CECrossfadeAnimationController : CEReversibleAnimationController\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CECrossfadeAnimationController.m",
    "content": "//\n//  CECrossfadeAnimationController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 11/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CECrossfadeAnimationController.h\"\n\n@implementation CECrossfadeAnimationController\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    // Add the toView to the container\n    UIView* containerView = [transitionContext containerView];\n    toView.frame = [transitionContext finalFrameForViewController:toVC];\n    [containerView addSubview:toView];\n    [containerView sendSubviewToBack:toView];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    [UIView animateWithDuration:duration animations:^{\n        fromView.alpha = 0.0;\n    } completion:^(BOOL finished) {\n        if ([transitionContext transitionWasCancelled]) {\n            fromView.alpha = 1.0;\n        } else {\n            // reset from- view to its original state\n            [fromView removeFromSuperview];\n            fromView.alpha = 1.0;\n        }\n        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n    }];\n    \n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CECubeAnimationController.h",
    "content": "//\n//  CubeNavigationAnimator.h\n//  MovieQuiz\n//\n//  Created by Andrés Brun on 27/10/13.\n//  Copyright (c) 2013 Andrés Brun. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"CEReversibleAnimationController.h\"\n\ntypedef enum {CubeAnimationWayHorizontal, CubeAnimationWayVertical} CubeAnimationWay;\ntypedef enum {CubeAnimationTypeInverse, CubeAnimationTypeNormal} CubeAnimationType;\n\n@interface CECubeAnimationController : CEReversibleAnimationController\n\n@property (nonatomic, assign) CubeAnimationWay cubeAnimationWay;\n@property (nonatomic, assign) CubeAnimationType cubeAnimationType;\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CECubeAnimationController.m",
    "content": "//\n//  CubeNavigationAnimator.m\n//  MovieQuiz\n//\n//  Created by Andrés Brun on 27/10/13.\n//  Copyright (c) 2013 Andrés Brun. All rights reserved.\n//\n\n#import \"CECubeAnimationController.h\"\n\n#define PERSPECTIVE -1.0 / 200.0\n#define ROTATION_ANGLE M_PI_2\n\n@implementation CECubeAnimationController\n\n- (id)init\n{\n    self = [super init];\n    if (self) {\n        self.cubeAnimationWay = CubeAnimationWayHorizontal;\n    }\n    return self;\n}\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView\n{\n    toView.frame = [transitionContext finalFrameForViewController:toVC];\n\n    //Calculate the direction\n    int dir = self.reverse ? 1 : -1;\n  \n    //Create the differents 3D animations\n    CATransform3D viewFromTransform;\n    CATransform3D viewToTransform;\n\n    //We create a content view for do the translate animation\n    UIView *generalContentView = [transitionContext containerView];\n                                  \n    switch (self.cubeAnimationWay) {\n        case CubeAnimationWayHorizontal:\n            viewFromTransform = CATransform3DMakeRotation(dir*ROTATION_ANGLE, 0.0, 1.0, 0.0);\n            viewToTransform = CATransform3DMakeRotation(-dir*ROTATION_ANGLE, 0.0, 1.0, 0.0);\n            [toView.layer setAnchorPoint:CGPointMake(dir==1?0:1, 0.5)];\n            [fromView.layer setAnchorPoint:CGPointMake(dir==1?1:0, 0.5)];\n            \n            [generalContentView setTransform:CGAffineTransformMakeTranslation(dir*(generalContentView.frame.size.width)/2.0, 0)];\n            break;\n            \n        case CubeAnimationWayVertical:\n            viewFromTransform = CATransform3DMakeRotation(-dir*ROTATION_ANGLE, 1.0, 0.0, 0.0);\n            viewToTransform = CATransform3DMakeRotation(dir*ROTATION_ANGLE, 1.0, 0.0, 0.0);\n            [toView.layer setAnchorPoint:CGPointMake(0.5, dir==1?0:1)];\n            [fromView.layer setAnchorPoint:CGPointMake(0.5, dir==1?1:0)];\n            \n            [generalContentView setTransform:CGAffineTransformMakeTranslation(0, dir*(generalContentView.frame.size.height)/2.0)];\n            break;\n            \n        default:\n            break;\n    }\n\n    viewFromTransform.m34 = PERSPECTIVE;\n    viewToTransform.m34 = PERSPECTIVE;\n\n    toView.layer.transform = viewToTransform;\n    \n    //Create the shadow\n    UIView *fromShadow = [self addOpacityToView:fromView withColor:[UIColor blackColor]];\n    UIView *toShadow = [self addOpacityToView:toView withColor:[UIColor blackColor]];\n    [fromShadow setAlpha:0.0];\n    [toShadow setAlpha:1.0];\n    \n    //Add the to- view\n    [generalContentView addSubview:toView];\n    \n    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{\n        switch (self.cubeAnimationWay) {\n            case CubeAnimationWayHorizontal:\n                [generalContentView setTransform:CGAffineTransformMakeTranslation(-dir*generalContentView.frame.size.width/2.0, 0)];\n                break;\n                \n            case CubeAnimationWayVertical:\n                [generalContentView setTransform:CGAffineTransformMakeTranslation(0, -dir*(generalContentView.frame.size.height)/2.0)];\n                break;\n                \n            default:\n                break;\n        }\n        \n        fromView.layer.transform = viewFromTransform;\n        toView.layer.transform = CATransform3DIdentity;\n        \n        [fromShadow setAlpha:1.0];\n        [toShadow setAlpha:0.0];\n        \n    } completion:^(BOOL finished) {\n        \n        //Set the final position of every elements transformed\n        [generalContentView setTransform:CGAffineTransformIdentity];\n        fromView.layer.transform = CATransform3DIdentity;\n        toView.layer.transform = CATransform3DIdentity;\n        [fromView.layer setAnchorPoint:CGPointMake(0.5f, 0.5f)];\n        [toView.layer setAnchorPoint:CGPointMake(0.5f, 0.5f)];\n        \n        [fromShadow removeFromSuperview];\n        [toShadow removeFromSuperview];\n        \n        if ([transitionContext transitionWasCancelled]) {\n            [toView removeFromSuperview];\n        } else {\n            [fromView removeFromSuperview];\n        }\n        \n        // inform the context of completion\n        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n        \n    }];\n}\n\n- (UIView *)addOpacityToView:(UIView *) view withColor:(UIColor *)theColor\n{\n  UIView *shadowView = [[UIView alloc] initWithFrame:view.bounds];\n  [shadowView setBackgroundColor:[theColor colorWithAlphaComponent:0.8]];\n  [view addSubview:shadowView];\n  return shadowView;\n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEExplodeAnimationController.h",
    "content": "//\n//  CEExplodeAnimationController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 11/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/**\n Animates between the two view controllers by slicing the from- view controller into lots of little pieces, then randomly spinning and shrinking them.\n */\n@interface CEExplodeAnimationController : CEReversibleAnimationController\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEExplodeAnimationController.m",
    "content": "//\n//  CEExplodeAnimationController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 11/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEExplodeAnimationController.h\"\n\n@implementation CEExplodeAnimationController\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    // Add the toView to the container\n    UIView* containerView = [transitionContext containerView];\n    [containerView addSubview:toView];\n    [containerView sendSubviewToBack:toView];\n    \n    CGSize size = toView.frame.size;\n    \n    NSMutableArray *snapshots = [NSMutableArray new];\n    \n    CGFloat xFactor = 10.0f;\n    CGFloat yFactor = xFactor * size.height / size.width;\n    \n    // snapshot the from view, this makes subsequent snaphots more performant\n    UIView *fromViewSnapshot = [fromView snapshotViewAfterScreenUpdates:NO];\n    \n    // create a snapshot for each of the exploding pieces\n    for (CGFloat x=0; x < size.width; x+= size.width / xFactor) {\n        for (CGFloat y=0; y < size.height; y+= size.height / yFactor) {\n            CGRect snapshotRegion = CGRectMake(x, y, size.width / xFactor, size.height / yFactor);\n            UIView *snapshot = [fromViewSnapshot resizableSnapshotViewFromRect:snapshotRegion  afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero];\n            snapshot.frame = snapshotRegion;\n            [containerView addSubview:snapshot];\n            [snapshots addObject:snapshot];\n        }\n    }\n    \n    [containerView sendSubviewToBack:fromView];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    [UIView animateWithDuration:duration animations:^{\n        for (UIView *view in snapshots) {\n            CGFloat xOffset = [self randomFloatBetween:-100.0 and:100.0];\n            CGFloat yOffset = [self randomFloatBetween:-100.0 and:100.0];\n            view.frame = CGRectOffset(view.frame, xOffset, yOffset);\n            view.alpha = 0.0;\n            view.transform = CGAffineTransformScale(CGAffineTransformMakeRotation([self randomFloatBetween:-10.0 and:10.0]), 0.01, 0.01);\n        }\n    } completion:^(BOOL finished) {\n        for (UIView *view in snapshots) {\n            [view removeFromSuperview];\n        }\n        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n    }];\n    \n}\n\n- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {\n    float diff = bigNumber - smallNumber;\n    return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;\n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEFlipAnimationController.h",
    "content": "//\n//  CEFlipAnimationController.h\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 09/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/**\n Animates between the two view controllers using a page-flip transition.\n */\n@interface CEFlipAnimationController : CEReversibleAnimationController\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEFlipAnimationController.m",
    "content": "//\n//  CEFlipAnimationController.m\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 09/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEFlipAnimationController.h\"\n\n@implementation CEFlipAnimationController\n\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    // Add the toView to the container\n    UIView* containerView = [transitionContext containerView];\n    [containerView addSubview:toView];\n    [containerView sendSubviewToBack:toView];\n    \n    // Add a perspective transform\n    CATransform3D transform = CATransform3DIdentity;\n    transform.m34 = -0.002;\n    [containerView.layer setSublayerTransform:transform];\n    \n    // Give both VCs the same start frame\n    CGRect initialFrame = [transitionContext initialFrameForViewController:fromVC];\n    fromView.frame =  initialFrame;\n    toView.frame = initialFrame;\n    \n    // create two-part snapshots of both the from- and to- views\n    NSArray* toViewSnapshots = [self createSnapshots:toView afterScreenUpdates:YES];\n    UIView* flippedSectionOfToView = toViewSnapshots[self.reverse ? 0 : 1];\n    \n    NSArray* fromViewSnapshots = [self createSnapshots:fromView afterScreenUpdates:NO];\n    UIView* flippedSectionOfFromView = fromViewSnapshots[self.reverse ? 1 : 0];\n    \n    // replace the from- and to- views with container views that include gradients\n    flippedSectionOfFromView = [self addShadowToView:flippedSectionOfFromView reverse:!self.reverse];\n    UIView* flippedSectionOfFromViewShadow = flippedSectionOfFromView.subviews[1];\n    flippedSectionOfFromViewShadow.alpha = 0.0;\n    \n    flippedSectionOfToView = [self addShadowToView:flippedSectionOfToView reverse:self.reverse];\n    UIView* flippedSectionOfToViewShadow = flippedSectionOfToView.subviews[1];\n    flippedSectionOfToViewShadow.alpha = 1.0;\n    \n    // change the anchor point so that the view rotate around the correct edge\n    [self updateAnchorPointAndOffset:CGPointMake(self.reverse ? 0.0 : 1.0, 0.5) view:flippedSectionOfFromView];\n    [self updateAnchorPointAndOffset:CGPointMake(self.reverse ? 1.0 : 0.0, 0.5) view:flippedSectionOfToView];\n    \n    // rotate the to- view by 90 degrees, hiding it\n    flippedSectionOfToView.layer.transform = [self rotate:self.reverse ? M_PI_2 : -M_PI_2];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    \n    [UIView animateKeyframesWithDuration:duration\n                                   delay:0.0\n                                 options:0\n                              animations:^{\n                                  [UIView addKeyframeWithRelativeStartTime:0.0\n                                                          relativeDuration:0.5\n                                                                animations:^{\n                                                                    // rotate the from- view to 90 degrees\n                                                                    flippedSectionOfFromView.layer.transform = [self rotate:self.reverse ? -M_PI_2 : M_PI_2];\n                                                                    flippedSectionOfFromViewShadow.alpha = 1.0;\n                                                                }];\n                                  [UIView addKeyframeWithRelativeStartTime:0.5\n                                                          relativeDuration:0.5\n                                                                animations:^{\n                                                                    // rotate the to- view to 0 degrees\n                                                                    flippedSectionOfToView.layer.transform = [self rotate:self.reverse ? 0.001 : -0.001];\n                                                                    flippedSectionOfToViewShadow.alpha = 0.0;\n                                                                }];\n                              } completion:^(BOOL finished) {\n                                  \n                                  // remove all the temporary views\n                                  if ([transitionContext transitionWasCancelled]) {\n                                      [self removeOtherViews:fromView];\n                                  } else {\n                                      [self removeOtherViews:toView];\n                                  }\n                                  \n                                  // inform the context of completion\n                                  [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n                              }];\n    \n}\n\n// removes all the views other than the given view from the superview\n- (void)removeOtherViews:(UIView*)viewToKeep {\n    UIView* containerView = viewToKeep.superview;\n    for (UIView* view in containerView.subviews) {\n        if (view != viewToKeep) {\n            [view removeFromSuperview];\n        }\n    }\n}\n\n// adds a gradient to an image by creating a containing UIView with both the given view\n// and the gradient as subviews\n- (UIView*)addShadowToView:(UIView*)view reverse:(BOOL)reverse {\n    \n    UIView* containerView = view.superview;\n    \n    // create a view with the same frame\n    UIView* viewWithShadow = [[UIView alloc] initWithFrame:view.frame];\n    \n    // replace the view that we are adding a shadow to\n    [containerView insertSubview:viewWithShadow aboveSubview:view];\n    [view removeFromSuperview];\n    \n    // create a shadow\n    UIView* shadowView = [[UIView alloc] initWithFrame:viewWithShadow.bounds];\n    CAGradientLayer *gradient = [CAGradientLayer layer];\n    gradient.frame = shadowView.bounds;\n    gradient.colors = @[(id)[UIColor colorWithWhite:0.0 alpha:0.0].CGColor,\n                        (id)[UIColor colorWithWhite:0.0 alpha:0.5].CGColor];\n    gradient.startPoint = CGPointMake(reverse ? 0.0 : 1.0, 0.0);\n    gradient.endPoint = CGPointMake(reverse ? 1.0 : 0.0, 0.0);\n    [shadowView.layer insertSublayer:gradient atIndex:1];\n    \n    // add the original view into our new view\n    view.frame = view.bounds;\n    [viewWithShadow addSubview:view];\n    \n    // place the shadow on top\n    [viewWithShadow addSubview:shadowView];\n    \n    return viewWithShadow;\n}\n\n// creates a pair of snapshots from the given view\n- (NSArray*)createSnapshots:(UIView*)view afterScreenUpdates:(BOOL) afterUpdates{\n    UIView* containerView = view.superview;\n    \n    // snapshot the left-hand side of the view\n    CGRect snapshotRegion = CGRectMake(0, 0, view.frame.size.width / 2, view.frame.size.height);\n    UIView *leftHandView = [view resizableSnapshotViewFromRect:snapshotRegion  afterScreenUpdates:afterUpdates withCapInsets:UIEdgeInsetsZero];\n    leftHandView.frame = snapshotRegion;\n    [containerView addSubview:leftHandView];\n    \n    // snapshot the right-hand side of the view\n    snapshotRegion = CGRectMake(view.frame.size.width / 2, 0, view.frame.size.width / 2, view.frame.size.height);\n    UIView *rightHandView = [view resizableSnapshotViewFromRect:snapshotRegion  afterScreenUpdates:afterUpdates withCapInsets:UIEdgeInsetsZero];\n    rightHandView.frame = snapshotRegion;\n    [containerView addSubview:rightHandView];\n    \n    // send the view that was snapshotted to the back\n    [containerView sendSubviewToBack:view];\n    \n    return @[leftHandView, rightHandView];\n}\n\n// updates the anchor point for the given view, offseting the frame to compensate for the resulting movement\n- (void)updateAnchorPointAndOffset:(CGPoint)anchorPoint view:(UIView*)view {\n    view.layer.anchorPoint = anchorPoint;\n    float xOffset =  anchorPoint.x - 0.5;\n    view.frame = CGRectOffset(view.frame, xOffset * view.frame.size.width, 0);\n}\n\n\n- (CATransform3D) rotate:(CGFloat) angle {\n    return  CATransform3DMakeRotation(angle, 0.0, 1.0, 0.0);\n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEFoldAnimationController.h",
    "content": "//\n//  CEAccordionAnimationController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 12/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/**\n Animates between the two view controllers using a paper-fold style transition. You can configure the number of folds via the `folds` property.\n */\n@interface CEFoldAnimationController : CEReversibleAnimationController\n\n@property (nonatomic) NSUInteger folds;\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEFoldAnimationController.m",
    "content": "//\n//  CEAccordionAnimationController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 12/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEFoldAnimationController.h\"\n\n@implementation CEFoldAnimationController\n\n- (id)init {\n    if (self = [super init]) {\n        self.folds = 2;\n    }\n    return self;\n}\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    // Add the toView to the container\n    UIView* containerView = [transitionContext containerView];\n\n    // move offscreen\n    toView.frame = [transitionContext finalFrameForViewController:toVC];\n    toView.frame = CGRectOffset(toView.frame, toView.frame.size.width, 0);\n    [containerView addSubview:toView];\n    \n    // Add a perspective transform\n    CATransform3D transform = CATransform3DIdentity;\n    transform.m34 = -0.005;\n    containerView.layer.sublayerTransform = transform;\n    \n    CGSize size = toView.frame.size;\n    \n    float foldWidth = size.width * 0.5 / (float)self.folds ;\n    \n    // arrays that hold the snapshot views\n    NSMutableArray* fromViewFolds = [NSMutableArray new];\n    NSMutableArray* toViewFolds = [NSMutableArray new];\n    \n    // create the folds for the form- and to- views\n    for (int i=0 ;i<self.folds; i++){\n        float offset = (float)i * foldWidth * 2;\n        \n        // the left and right side of the fold for the from- view, with identity transform and 0.0 alpha\n        // on the shadow, with each view at its initial position\n        UIView *leftFromViewFold = [self createSnapshotFromView:fromView afterUpdates:NO location:offset left:YES];\n        leftFromViewFold.layer.position = CGPointMake(offset, size.height/2);\n        [fromViewFolds addObject:leftFromViewFold];\n        [leftFromViewFold.subviews[1] setAlpha:0.0];\n        \n        UIView *rightFromViewFold = [self createSnapshotFromView:fromView afterUpdates:NO location:offset + foldWidth left:NO];\n        rightFromViewFold.layer.position = CGPointMake(offset + foldWidth * 2, size.height/2);\n        [fromViewFolds addObject:rightFromViewFold];\n        [rightFromViewFold.subviews[1] setAlpha:0.0];\n        \n        // the left and right side of the fold for the to- view, with a 90-degree transform and 1.0 alpha\n        // on the shadow, with each view positioned at the very edge of the screen\n        UIView *leftToViewFold = [self createSnapshotFromView:toView afterUpdates:YES location:offset left:YES];\n        leftToViewFold.layer.position = CGPointMake(self.reverse ? size.width : 0.0, size.height/2);\n        leftToViewFold.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);\n        [toViewFolds addObject:leftToViewFold];\n        \n        UIView *rightToViewFold = [self createSnapshotFromView:toView afterUpdates:YES location:offset + foldWidth left:NO];\n        rightToViewFold.layer.position = CGPointMake(self.reverse ? size.width : 0.0, size.height/2);\n        rightToViewFold.layer.transform = CATransform3DMakeRotation(-M_PI_2, 0.0, 1.0, 0.0);\n        [toViewFolds addObject:rightToViewFold];\n    }\n    \n    // move the from- view off screen\n    fromView.frame = CGRectOffset(fromView.frame, fromView.frame.size.width, 0);\n\n    // create the animation\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    [UIView animateWithDuration:duration animations:^{\n        // set the final state for each fold\n        for (int i=0; i<self.folds; i++){\n            \n            float offset = (float)i * foldWidth * 2;\n            \n            // the left and right side of the fold for the from- view, with 90 degree transform and 1.0 alpha\n            // on the shadow, with each view positioned at the edge of thw screen.\n            UIView* leftFromView = fromViewFolds[i*2];\n            leftFromView.layer.position = CGPointMake(self.reverse ? 0.0 : size.width, size.height/2);\n            leftFromView.layer.transform = CATransform3DRotate(transform, M_PI_2, 0.0, 1.0, 0);\n            [leftFromView.subviews[1] setAlpha:1.0];\n            \n            UIView* rightFromView = fromViewFolds[i*2+1];\n            rightFromView.layer.position = CGPointMake(self.reverse ? 0.0 : size.width, size.height/2);\n            rightFromView.layer.transform = CATransform3DRotate(transform, -M_PI_2, 0.0, 1.0, 0);\n            [rightFromView.subviews[1] setAlpha:1.0];\n            \n            // the left and right side of the fold for the to- view, with identity transform and 0.0 alpha\n            // on the shadow, with each view at its final position\n            UIView* leftToView = toViewFolds[i*2];\n            leftToView.layer.position = CGPointMake(offset, size.height/2);\n            leftToView.layer.transform = CATransform3DIdentity;\n            [leftToView.subviews[1] setAlpha:0.0];\n            \n            UIView* rightToView = toViewFolds[i*2+1];\n            rightToView.layer.position = CGPointMake(offset + foldWidth * 2, size.height/2);\n            rightToView.layer.transform = CATransform3DIdentity;\n            [rightToView.subviews[1] setAlpha:0.0];\n         \n            \n        }\n    }  completion:^(BOOL finished) {\n        // remove the snapshot views\n        for (UIView *view in toViewFolds) {\n            [view removeFromSuperview];\n        }\n        for (UIView *view in fromViewFolds) {\n            [view removeFromSuperview];\n        }\n      \n        BOOL transitionFinished = ![transitionContext transitionWasCancelled];\n        if (transitionFinished) {\n          // restore the to- and from- to the initial location\n          toView.frame = containerView.bounds;\n          fromView.frame = containerView.bounds;\n        }\n        else {\n          // restore the from- to the initial location if cancelled\n          fromView.frame = containerView.bounds;\n        }\n        [transitionContext completeTransition:transitionFinished];\n    }];\n\n    \n}\n\n// creates a snapshot for the gives view\n-(UIView*) createSnapshotFromView:(UIView *)view afterUpdates:(BOOL)afterUpdates location:(CGFloat)offset left:(BOOL)left {\n    \n    CGSize size = view.frame.size;\n    UIView *containerView = view.superview;\n    float foldWidth = size.width * 0.5 / (float)self.folds ;\n    \n    UIView* snapshotView;\n    \n    if (!afterUpdates) {\n        // create a regular snapshot\n        CGRect snapshotRegion = CGRectMake(offset, 0.0, foldWidth, size.height);\n        snapshotView = [view resizableSnapshotViewFromRect:snapshotRegion  afterScreenUpdates:afterUpdates withCapInsets:UIEdgeInsetsZero];\n        \n    } else {\n        // for the to- view for some reason the snapshot takes a while to create. Here we place the snapshot within\n        // another view, with the same bckground color, so that it is less noticeable when the snapshot initially renders\n        snapshotView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, foldWidth, size.height)];\n        snapshotView.backgroundColor = view.backgroundColor;\n        CGRect snapshotRegion = CGRectMake(offset, 0.0, foldWidth, size.height);\n        UIView* snapshotView2 = [view resizableSnapshotViewFromRect:snapshotRegion  afterScreenUpdates:afterUpdates withCapInsets:UIEdgeInsetsZero];\n        [snapshotView addSubview:snapshotView2];\n        \n    }\n    \n    // create a shadow\n    UIView* snapshotWithShadowView = [self addShadowToView:snapshotView reverse:left];\n    \n    // add to the container\n    [containerView addSubview:snapshotWithShadowView];\n    \n    // set the anchor to the left or right edge of the view\n    snapshotWithShadowView.layer.anchorPoint = CGPointMake( left ? 0.0 : 1.0, 0.5);\n    \n    return snapshotWithShadowView;\n}\n\n\n// adds a gradient to an image by creating a containing UIView with both the given view\n// and the gradient as subviews\n- (UIView*)addShadowToView:(UIView*)view reverse:(BOOL)reverse {\n    \n    // create a view with the same frame\n    UIView* viewWithShadow = [[UIView alloc] initWithFrame:view.frame];\n    \n    // create a shadow\n    UIView* shadowView = [[UIView alloc] initWithFrame:viewWithShadow.bounds];\n    CAGradientLayer *gradient = [CAGradientLayer layer];\n    gradient.frame = shadowView.bounds;\n    gradient.colors = @[(id)[UIColor colorWithWhite:0.0 alpha:0.0].CGColor,\n                        (id)[UIColor colorWithWhite:0.0 alpha:1.0].CGColor];\n    gradient.startPoint = CGPointMake(reverse ? 0.0 : 1.0, reverse ? 0.2 : 0.0);\n    gradient.endPoint = CGPointMake(reverse ? 1.0 : 0.0, reverse ? 0.0 : 1.0);\n    [shadowView.layer insertSublayer:gradient atIndex:1];\n    \n    // add the original view into our new view\n    view.frame = view.bounds;\n    [viewWithShadow addSubview:view];\n    \n    // place the shadow on top\n    [viewWithShadow addSubview:shadowView];\n    \n    return viewWithShadow;\n}\n\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CENatGeoAnimationController.h",
    "content": "//\n//  CENatGeoAnimationController.h\n//  TransitionsDemo\n//\n//  Created by Paweł Wrzosek on 22.10.2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/**\n NatGeo-inspired transition adopted to iOS7 API.\n @see https://github.com/michaelhenry/MHNatGeoViewControllerTransition\n */\n@interface CENatGeoAnimationController : CEReversibleAnimationController\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CENatGeoAnimationController.m",
    "content": "//\n//  CENatGeoAnimationController.m\n//  TransitionsDemo\n//\n//  Created by Paweł Wrzosek on 22.10.2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CENatGeoAnimationController.h\"\n\nstatic const CGFloat kAnimationFirstPartRatio = 0.8f;\n\n@implementation CENatGeoAnimationController\n\n- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {\n    // Grab the from and to view controllers from the context\n    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];\n    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];\n    \n    [transitionContext.containerView addSubview:fromViewController.view];\n    [transitionContext.containerView addSubview:toViewController.view];\n    \n    CALayer *fromLayer;\n    CALayer *toLayer;\n    \n    if (self.reverse) {\n        toViewController.view.userInteractionEnabled = YES;\n        \n        fromLayer = toViewController.view.layer;\n        toLayer = fromViewController.view.layer;\n        \n        // Reset to initial transform\n        sourceLastTransform(fromLayer);\n        destinationLastTransform(toLayer);\n        \n        \n        //Perform animation\n        [UIView animateKeyframesWithDuration:self.duration\n                                       delay:0.0\n                                     options:UIViewKeyframeAnimationOptionCalculationModeCubic\n                                  animations:^{\n            \n            [UIView addKeyframeWithRelativeStartTime:0.0f\n                                    relativeDuration:kAnimationFirstPartRatio\n                                            animations:^{\n                sourceFirstTransform(fromLayer);\n            }];\n            \n            [UIView addKeyframeWithRelativeStartTime:0.0f\n                                    relativeDuration:1.0f\n                                          animations:^{\n                destinationFirstTransform(toLayer);\n            }];\n            \n        } completion:^(BOOL finished) {\n            // Bring the from view back to the front and re-disable the user\n            // interaction of the to view since the dismissal has been cancelled\n            if ([transitionContext transitionWasCancelled])\n            {\n                [transitionContext.containerView bringSubviewToFront:fromViewController.view];\n                toViewController.view.userInteractionEnabled = NO;\n            }\n\t\t\t\n            fromViewController.view.layer.transform = CATransform3DIdentity;\n            toViewController.view.layer.transform = CATransform3DIdentity;\n            transitionContext.containerView.layer.transform = CATransform3DIdentity;\n            [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n        }];\n        \n    } else {\n        fromViewController.view.userInteractionEnabled = NO;\n        \n        fromLayer = fromViewController.view.layer;\n        toLayer = toViewController.view.layer;\n        \n        // Change anchor point and reposition it.\n        CGRect oldFrame = fromLayer.frame;\n        [fromLayer setAnchorPoint:CGPointMake(0.0f, 0.5f)];\n        [fromLayer setFrame:oldFrame];\n        \n        // Reset to initial transform\n        sourceFirstTransform(fromLayer);\n        destinationFirstTransform(toLayer);\n        \n        //Perform animation\n        [UIView animateKeyframesWithDuration:self.duration\n                                       delay:0.0\n                                     options:UIViewKeyframeAnimationOptionCalculationModeCubic\n                                  animations:^{\n            \n            [UIView addKeyframeWithRelativeStartTime:0.0f\n                                    relativeDuration:1.0f\n                                          animations:^{\n                destinationLastTransform(toLayer);\n            }];\n            \n            [UIView addKeyframeWithRelativeStartTime:(1.0f - kAnimationFirstPartRatio)\n                                    relativeDuration:kAnimationFirstPartRatio\n                                          animations:^{\n                sourceLastTransform(fromLayer);\n            }];\n\n        } completion:^(BOOL finished) {\n            // Bring the from view back to the front and re-enable its user\n            // interaction since the presentation has been cancelled\n            if ([transitionContext transitionWasCancelled])\n            {\n                [transitionContext.containerView bringSubviewToFront:fromViewController.view];\n                fromViewController.view.userInteractionEnabled = YES;\n            }\n\t\t\t\n            fromViewController.view.layer.transform = CATransform3DIdentity;\n            toViewController.view.layer.transform = CATransform3DIdentity;\n            transitionContext.containerView.layer.transform = CATransform3DIdentity;\n            [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n        }];\n    }\n    \n}\n\n#pragma mark -\n\n#pragma mark - Required 3d Transform\nstatic void sourceFirstTransform(CALayer *layer) {\n    CATransform3D t = CATransform3DIdentity;\n    t.m34 = 1.0 / -500;\n    t = CATransform3DTranslate(t, 0.0f, 0.0f, 0.0f);\n    layer.transform = t;\n}\n\nstatic void sourceLastTransform(CALayer *layer) {\n    CATransform3D t = CATransform3DIdentity;\n    t.m34 = 1.0 / -500.0f;\n    t = CATransform3DRotate(t, radianFromDegree(80), 0.0f, 1.0f, 0.0f);\n    t = CATransform3DTranslate(t, 0.0f, 0.0f, -30.0f);\n    t = CATransform3DTranslate(t, 170.0f, 0.0f, 0.0f);\n    layer.transform = t;\n}\n\nstatic void destinationFirstTransform(CALayer * layer) {\n    CATransform3D t = CATransform3DIdentity;\n    t.m34 = 1.0f / -500.0f;\n    // Rotate 5 degrees within the axis of z axis\n    t = CATransform3DRotate(t, radianFromDegree(5.0f), 0.0f, 0.0f, 1.0f);\n    // Reposition toward to the left where it initialized\n    t = CATransform3DTranslate(t, 320.0f, -40.0f, 150.0f);\n    // Rotate it -45 degrees within the y axis\n    t = CATransform3DRotate(t, radianFromDegree(-45), 0.0f, 1.0f, 0.0f);\n    // Rotate it 10 degrees within thee x axis\n    t = CATransform3DRotate(t, radianFromDegree(10), 1.0f, 0.0f, 0.0f);\n    layer.transform = t;\n}\n\nstatic void destinationLastTransform(CALayer * layer) {\n    CATransform3D t = CATransform3DIdentity;\n    t.m34 = 1.0/ -500;\n    // Rotate to 0 degrees within z axis\n    t = CATransform3DRotate(t, radianFromDegree(0), 0.0f, 0.0f, 1.0f);\n    // Bring back to the final position\n    t = CATransform3DTranslate(t, 0.0f, 0.0f, 0.0f);\n    // Rotate 0 degrees within y axis\n    t = CATransform3DRotate(t, radianFromDegree(0), 0.0f, 1.0f, 0.0f);\n    // Rotate 0 degrees within  x axis\n    t = CATransform3DRotate(t, radianFromDegree(0), 1.0f, 0.0f, 0.0f);\n    layer.transform = t;\n}\n\n#pragma mark - Convert Degrees to Radian\nstatic double radianFromDegree(float degrees) {\n    return (degrees / 180) * M_PI;\n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEPanAnimationController.h",
    "content": "//\n//  CEPanAnimationController.h\n//  TransitionsDemo\n//\n//  Created by Alvin Zeng on 01/08/2014.\n//  Copyright (c) 2014 Alvin Zeng. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/**\n Animates between the two view controllers by performing a simple pan. \n */\n@interface CEPanAnimationController : CEReversibleAnimationController\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEPanAnimationController.m",
    "content": "//\n//  CEPanAnimationController.m\n//  TransitionsDemo\n//\n//  Created by Alvin Zeng on 01/08/2014.\n//  Copyright (c) 2014 Alvin Zeng. All rights reserved.\n//\n\n#import \"CEPanAnimationController.h\"\n\n@implementation CEPanAnimationController\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    self.duration = .3;\n    // Add the toView to the container\n    UIView* containerView = [transitionContext containerView];\n    [containerView addSubview:toView];\n    toView.frame = CGRectMake(self.reverse ? -160 : 320, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height);\n    \n    self.reverse ? [containerView sendSubviewToBack:toView] : [containerView bringSubviewToFront:toView];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    [UIView animateWithDuration:duration animations:^{\n        fromView.frame = CGRectMake(!self.reverse ? -160 : 320, fromView.frame.origin.y, fromView.frame.size.width, fromView.frame.size.height);\n        toView.frame = CGRectMake(0, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height);\n    } completion:^(BOOL finished) {\n        if ([transitionContext transitionWasCancelled]) {\n            toView.frame = CGRectMake(0, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height);\n            fromView.frame = CGRectMake(0, fromView.frame.origin.y, fromView.frame.size.width, fromView.frame.size.height);\n        } else {\n            // reset from- view to its original state\n            [fromView removeFromSuperview];\n            fromView.frame = CGRectMake(!self.reverse ? -160 : 320, fromView.frame.origin.y, fromView.frame.size.width, fromView.frame.size.height);\n            toView.frame = CGRectMake(0, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height);\n        }\n        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n    }];\n    \n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEPortalAnimationController.h",
    "content": "//\n//  ZENPortalAnimationController.h\n//  ZEN BabyBook\n//\n//  Created by Frédéric ADDA on 07/12/2013.\n//  Copyright (c) 2013 Frédéric ADDA. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n/*\n Animates between the two view controllers using a portal-opening transition.\n */\n\n@interface CEPortalAnimationController : CEReversibleAnimationController\n@end\n"
  },
  {
    "path": "AnimationControllers/CEPortalAnimationController.m",
    "content": "//\n//  ZENPortalAnimationController.m\n//  ZEN BabyBook\n//\n//  Created by Frédéric ADDA on 07/12/2013.\n//  Copyright (c) 2013 Frédéric ADDA. All rights reserved.\n//\n\n#import \"CEPortalAnimationController.h\"\n\n@implementation CEPortalAnimationController\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    if(self.reverse){\n        [self executeReverseAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView];\n    } else {\n        [self executeForwardsAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView];\n    }\n    \n}\n\n#define ZOOM_SCALE 0.8\n- (void)executeForwardsAnimation:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    UIView *containerView = [transitionContext containerView];\n\n    // Add a reduced snapshot of the toView to the container\n    UIView *toViewSnapshot = [toView resizableSnapshotViewFromRect:toView.frame afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];\n    CATransform3D scale = CATransform3DIdentity;\n    toViewSnapshot.layer.transform = CATransform3DScale(scale, ZOOM_SCALE, ZOOM_SCALE, 1);\n    [containerView addSubview:toViewSnapshot];\n    [containerView sendSubviewToBack:toViewSnapshot];\n    \n    \n    // Create two-part snapshots of the from- view\n    \n    // snapshot the left-hand side of the from- view\n    CGRect leftSnapshotRegion = CGRectMake(0, 0, fromView.frame.size.width / 2, fromView.frame.size.height);\n    UIView *leftHandView = [fromView resizableSnapshotViewFromRect:leftSnapshotRegion  afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero];\n    leftHandView.frame = leftSnapshotRegion;\n    [containerView addSubview:leftHandView];\n    \n    // snapshot the right-hand side of the from- view\n    CGRect rightSnapshotRegion = CGRectMake(fromView.frame.size.width / 2, 0, fromView.frame.size.width / 2, fromView.frame.size.height);\n    UIView *rightHandView = [fromView resizableSnapshotViewFromRect:rightSnapshotRegion  afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero];\n    rightHandView.frame = rightSnapshotRegion;\n    [containerView addSubview:rightHandView];\n    \n    // remove the view that was snapshotted\n    [fromView removeFromSuperview];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    \n    [UIView animateWithDuration:duration\n                          delay:0.0\n                        options:UIViewAnimationOptionCurveEaseOut\n                     animations:^{\n                         // Open the portal doors of the from-view\n                         leftHandView.frame = CGRectOffset(leftHandView.frame, - leftHandView.frame.size.width, 0);\n                         rightHandView.frame = CGRectOffset(rightHandView.frame, rightHandView.frame.size.width, 0);\n                         \n                         // zoom in the to-view\n                         toViewSnapshot.center = toView.center;\n                         toViewSnapshot.frame = toView.frame;\n                         \n                     } completion:^(BOOL finished) {\n                         \n                         // remove all the temporary views\n                         if ([transitionContext transitionWasCancelled]) {\n                             [containerView addSubview:fromView];\n                             [self removeOtherViews:fromView];\n                         } else {\n                             // add the real to- view and remove the snapshots\n                             [containerView addSubview:toView];\n                             [self removeOtherViews:toView];\n                         }\n                         \n                         // inform the context of completion\n                         [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n                     }];\n    \n}\n\n\n\n- (void)executeReverseAnimation:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    UIView *containerView = [transitionContext containerView];\n\n    // Add the from-view to the container\n    [containerView addSubview:fromView];\n    \n    // add the to- view and send offscreen (we need to do this in order to allow snapshotting)\n    toView.frame = [transitionContext finalFrameForViewController:toVC];\n    toView.frame = CGRectOffset(toView.frame, toView.frame.size.width, 0);\n    [containerView addSubview:toView];\n    \n    \n    // Create two-part snapshots of the to- view\n    \n    // snapshot the left-hand side of the to- view\n    CGRect leftSnapshotRegion = CGRectMake(0, 0, toView.frame.size.width / 2, toView.frame.size.height);\n    UIView *leftHandView = [toView resizableSnapshotViewFromRect:leftSnapshotRegion  afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];\n    leftHandView.frame = leftSnapshotRegion;\n    // reverse animation : start from beyond the edges of the screen\n    leftHandView.frame = CGRectOffset(leftHandView.frame, - leftHandView.frame.size.width, 0);\n    [containerView addSubview:leftHandView];\n    \n    // snapshot the right-hand side of the to- view\n    CGRect rightSnapshotRegion = CGRectMake(toView.frame.size.width / 2, 0, toView.frame.size.width / 2, toView.frame.size.height);\n    UIView *rightHandView = [toView resizableSnapshotViewFromRect:rightSnapshotRegion  afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];\n    rightHandView.frame = rightSnapshotRegion;\n    // reverse animation : start from beyond the edges of the screen\n    rightHandView.frame = CGRectOffset(rightHandView.frame, rightHandView.frame.size.width, 0);\n    [containerView addSubview:rightHandView];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    \n    \n    [UIView animateWithDuration:duration\n                          delay:0.0\n                        options:UIViewAnimationOptionCurveEaseOut\n                     animations:^{\n                         // Close the portal doors of the to-view\n                         leftHandView.frame = CGRectOffset(leftHandView.frame, leftHandView.frame.size.width, 0);\n                         rightHandView.frame = CGRectOffset(rightHandView.frame, - rightHandView.frame.size.width, 0);\n                         \n                         // Zoom out the from-view\n                         CATransform3D scale = CATransform3DIdentity;\n                         fromView.layer.transform = CATransform3DScale(scale, ZOOM_SCALE, ZOOM_SCALE, 1);\n\n                         \n                     } completion:^(BOOL finished) {\n                         \n                         // remove all the temporary views\n                         if ([transitionContext transitionWasCancelled]) {\n                             [self removeOtherViews:fromView];\n                         } else {\n                             [self removeOtherViews:toView];\n                             toView.frame = containerView.bounds;\n                         }\n                         \n                         // inform the context of completion\n                         [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n                     }];\n}\n\n\n// removes all the views other than the given view from the superview\n- (void)removeOtherViews:(UIView*)viewToKeep {\n    UIView *containerView = viewToKeep.superview;\n    for (UIView *view in containerView.subviews) {\n        if (view != viewToKeep) {\n            [view removeFromSuperview];\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEReversibleAnimationController.h",
    "content": "//\n//  CEBaseAnimationController.h\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 09/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n A base class for animation controllers which provide reversible animations. A reversible animation is often used with navigation controllers where the reverse property is set based on whether this is a push or pop operation, or for modal view controllers where the reverse property is set based o whether this is a show / dismiss.\n */\n@interface CEReversibleAnimationController : NSObject <UIViewControllerAnimatedTransitioning>\n\n/**\n The direction of the animation.\n */\n@property (nonatomic, assign) BOOL reverse;\n\n/**\n The animation duration.\n */\n@property (nonatomic, assign) NSTimeInterval duration;\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView;\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CEReversibleAnimationController.m",
    "content": "//\n//  CEBaseAnimationController.m\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 09/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEReversibleAnimationController.h\"\n\n@implementation CEReversibleAnimationController\n\n- (id)init {\n    if (self = [super init]) {\n        self.duration = 1.0f;\n    }\n    return self;\n}\n\n- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {\n    return self.duration;\n}\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {\n    \n    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];\n    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];\n    UIView *toView = toVC.view;\n    UIView *fromView = fromVC.view;\n    \n    [self animateTransition:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView];\n}\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n}\n\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CETurnAnimationController.h",
    "content": "//\n//  CEFlipAnimationController.h\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 08/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"CEReversibleAnimationController.h\"\n\ntypedef NS_ENUM(NSInteger, CEDirection) {\n    CEDirectionHorizontal,\n    CEDirectionVertical\n};\n\n/**\n Animates between the two view controllers by performing a 3D flip, to reveal the destination view on the back.The turn animation has a `flipDirection` property that specifies the turn orientation.\n */\n@interface CETurnAnimationController : CEReversibleAnimationController\n\n@property (nonatomic, assign) CEDirection flipDirection;\n\n@end\n"
  },
  {
    "path": "AnimationControllers/CETurnAnimationController.m",
    "content": "//\n//  CEFlipAnimationController.m\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 08/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CETurnAnimationController.h\"\n#import <QuartzCore/QuartzCore.h>\n\n@implementation CETurnAnimationController\n\n- (id)init {\n    if (self = [super init]) {\n        self.flipDirection = CEDirectionVertical;\n    }\n    return self;\n}\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView {\n    \n    // Add the toView to the container\n    UIView* containerView = [transitionContext containerView];\n    [containerView addSubview:toView];\n    \n    // Add a perspective transform\n    CATransform3D transform = CATransform3DIdentity;\n    transform.m34 = -0.002;\n    [containerView.layer setSublayerTransform:transform];\n    \n    // Give both VCs the same start frame\n    CGRect initialFrame = [transitionContext initialFrameForViewController:fromVC];\n    fromView.frame = initialFrame;\n    toView.frame = initialFrame;\n    \n    // reverse?\n    float factor = self.reverse ? 1.0 : -1.0;\n    \n    // flip the to VC halfway round - hiding it\n    toView.layer.transform = [self rotate:factor * -M_PI_2];\n    \n    // animate\n    NSTimeInterval duration = [self transitionDuration:transitionContext];\n    [UIView animateKeyframesWithDuration:duration\n                                   delay:0.0\n                                 options:0\n                              animations:^{\n                                  [UIView addKeyframeWithRelativeStartTime:0.0\n                                                          relativeDuration:0.5\n                                                                animations:^{\n                                                                    // rotate the from view\n                                                                    fromView.layer.transform = [self rotate:factor * M_PI_2];\n                                                                }];\n                                  [UIView addKeyframeWithRelativeStartTime:0.5\n                                                          relativeDuration:0.5\n                                                                animations:^{\n                                                                    // rotate the to view\n                                                                    toView.layer.transform =  [self rotate:0.0];\n                                                                }];\n                              } completion:^(BOOL finished) {\n                                  [transitionContext completeTransition:![transitionContext transitionWasCancelled]];\n                              }];\n\n}\n\n- (CATransform3D) rotate:(CGFloat) angle {\n    if (self.flipDirection == CEDirectionHorizontal)\n        return  CATransform3DMakeRotation(angle, 1.0, 0.0, 0.0);\n    else\n        return  CATransform3DMakeRotation(angle, 0.0, 1.0, 0.0);\n}\n\n@end\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Version 1.1.0\n\n + Added `CECardsAnimationController`\n + Added `CEVerticalSwipeInteractionController`\n + Renamed `CESwipeInteractionController` to `CEHorizontalInteractionController`\n\n# Version 1.0.0\n\nInitial release."
  },
  {
    "path": "InteractionControllers/CEBaseInteractionController.h",
    "content": "//\n//  CEBaseInteractionController.h\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/**\n An enumeration that describes the navigation operation that an interaction controller should initiate.\n */\ntypedef NS_ENUM(NSInteger, CEInteractionOperation) {\n    /**\n     Indicates that the interaction controller should start a navigation controller 'pop' navigation.\n     */\n    CEInteractionOperationPop,\n    /**\n     Indicates that the interaction controller should initiate a modal 'dismiss'.\n     */\n    CEInteractionOperationDismiss,\n    /**\n     Indicates that the interaction controller should navigate between tabs.\n     */\n    CEInteractionOperationTab\n};\n\n/**\n A base class for interaction controllers that can be used with navigation controllers to perform pop operations, or with view controllers that have been presented modally to perform dismissal.\n */\n@interface CEBaseInteractionController : UIPercentDrivenInteractiveTransition\n\n/**\n Connects this interaction controller to the given view controller.\n @param viewController The view controller which this interaction should add a gesture recognizer to.\n @param operation The operation that this interaction initiates when.\n*/\n- (void)wireToViewController:(UIViewController*)viewController forOperation:(CEInteractionOperation)operation;\n\n/**\n This property indicates whether an interactive transition is in progress.\n */\n@property (nonatomic, assign) BOOL interactionInProgress;\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEBaseInteractionController.m",
    "content": "//\n//  CEBaseInteractionController.m\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEBaseInteractionController.h\"\n\n@implementation CEBaseInteractionController\n\n- (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation {\n    \n    @throw [NSException exceptionWithName:NSInternalInconsistencyException\n                                   reason:[NSString stringWithFormat:@\"You must override %@ in a subclass\", NSStringFromSelector(_cmd)]\n                                 userInfo:nil];\n    \n}\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEHorizontalSwipeInteractionController.h",
    "content": "//\n//  SwipeInteractionController.h\n//  ILoveCatz\n//\n//  Created by Colin Eberhardt on 22/08/2013.\n//  Copyright (c) 2013 com.razeware. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"CEBaseInteractionController.h\"\n\n/**\n A horizontal swipe interaction controller. When used with a navigation controller, a right-to-left, or left-to-right swipe\n will cause a 'pop' navigation. When used wth a tabbar controller, right-to-left and left-to-right cause navigation\n between neighbouring tabs.\n */\n@interface CEHorizontalSwipeInteractionController : CEBaseInteractionController\n\n/**\n Indicates whether a navigation controller 'pop' should occur on a right-to-left, or a left-to-right\n swipe. This property does not affect tab controller or modal interactions.\n */\n@property (nonatomic) BOOL popOnRightToLeft;\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEHorizontalSwipeInteractionController.m",
    "content": "//\n//  SwipeINteractionController.m\n//  ILoveCatz\n//\n//  Created by Colin Eberhardt on 22/08/2013.\n//  Copyright (c) 2013 com.razeware. All rights reserved.\n//\n\n#import \"CEHorizontalSwipeInteractionController.h\"\n#import <objc/runtime.h>\n\nconst NSString *kCEHorizontalSwipeGestureKey = @\"kCEHorizontalSwipeGestureKey\";\n\n@implementation CEHorizontalSwipeInteractionController {\n    BOOL _shouldCompleteTransition;\n    UIViewController *_viewController;\n    CEInteractionOperation _operation;\n}\n\n\n- (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{\n    self.popOnRightToLeft = YES;\n    _operation = operation;\n    _viewController = viewController;\n    [self prepareGestureRecognizerInView:viewController.view];\n}\n\n\n- (void)prepareGestureRecognizerInView:(UIView*)view {\n    \n    UIPanGestureRecognizer *gesture = objc_getAssociatedObject(view, (__bridge const void *)(kCEHorizontalSwipeGestureKey));\n    \n    if (gesture) {\n        [view removeGestureRecognizer:gesture];\n    }\n    \n    \n    gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];\n    [view addGestureRecognizer:gesture];\n    \n    objc_setAssociatedObject(view, (__bridge const void *)(kCEHorizontalSwipeGestureKey), gesture,OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n}\n\n- (CGFloat)completionSpeed\n{\n    return 1 - self.percentComplete;\n}\n\n- (void)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer {\n    CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view.superview];\n    CGPoint vel = [gestureRecognizer velocityInView:gestureRecognizer.view];\n    \n    switch (gestureRecognizer.state) {\n        case UIGestureRecognizerStateBegan: {\n            \n            BOOL rightToLeftSwipe = vel.x < 0;\n            \n            // perform the required navigation operation ...\n            \n            if (_operation == CEInteractionOperationPop) {\n                // for pop operation, fire on right-to-left\n                if ((self.popOnRightToLeft && rightToLeftSwipe) ||\n                    (!self.popOnRightToLeft && !rightToLeftSwipe)) {\n                    self.interactionInProgress = YES;\n                    [_viewController.navigationController popViewControllerAnimated:YES];\n                }\n            } else if (_operation == CEInteractionOperationTab) {\n                // for tab controllers, we need to determine which direction to transition\n                if (rightToLeftSwipe) {\n                    if (_viewController.tabBarController.selectedIndex < _viewController.tabBarController.viewControllers.count - 1) {\n                        self.interactionInProgress = YES;\n                        _viewController.tabBarController.selectedIndex++;\n                    }\n                    \n                } else {\n                    if (_viewController.tabBarController.selectedIndex > 0) {\n                        self.interactionInProgress = YES;\n                        _viewController.tabBarController.selectedIndex--;\n                    }\n                }\n            } else {\n                // for dismiss, fire regardless of the translation direction\n                self.interactionInProgress = YES;\n                [_viewController dismissViewControllerAnimated:YES completion:nil];\n            }\n            break;\n        }\n        case UIGestureRecognizerStateChanged: {\n            if (self.interactionInProgress) {\n                // compute the current position\n                CGFloat fraction = fabs(translation.x / 200.0);\n                fraction = fminf(fmaxf(fraction, 0.0), 1.0);\n                _shouldCompleteTransition = (fraction > 0.5);\n                \n                // if an interactive transitions is 100% completed via the user interaction, for some reason\n                // the animation completion block is not called, and hence the transition is not completed.\n                // This glorious hack makes sure that this doesn't happen.\n                // see: https://github.com/ColinEberhardt/VCTransitionsLibrary/issues/4\n                if (fraction >= 1.0)\n                    fraction = 0.99;\n                \n                [self updateInteractiveTransition:fraction];\n            }\n            break;\n        }\n        case UIGestureRecognizerStateEnded:\n        case UIGestureRecognizerStateCancelled:\n            if (self.interactionInProgress) {\n                self.interactionInProgress = NO;\n                if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) {\n                    [self cancelInteractiveTransition];\n                }\n                else {\n                    [self finishInteractiveTransition];\n                }\n            }\n            break;\n        default:\n            break;\n    }\n}\n\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEPinchInteractionController.h",
    "content": "//\n//  CEPinchInteractionController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 16/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEBaseInteractionController.h\"\n\n@interface CEPinchInteractionController : CEBaseInteractionController\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEPinchInteractionController.m",
    "content": "//\n//  CEPinchInteractionController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 16/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEPinchInteractionController.h\"\n#import <objc/runtime.h>\n\nconst NSString *kCEPinchGestureKey = @\"kCEPinchGestureKey\";\n\n@implementation CEPinchInteractionController{\n    BOOL _shouldCompleteTransition;\n    UIViewController *_viewController;\n    CEInteractionOperation _operation;\n    CGFloat _startScale;\n}\n\n- (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{\n    _operation = operation;\n    _viewController = viewController;\n    [self prepareGestureRecognizerInView:viewController.view];\n}\n\n\n- (void)prepareGestureRecognizerInView:(UIView*)view {\n    \n    UIPinchGestureRecognizer *gesture = objc_getAssociatedObject(view, (__bridge const void *)(kCEPinchGestureKey));\n    \n    if (gesture) {\n        [view removeGestureRecognizer:gesture];\n    }\n    \n    gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];\n    [view addGestureRecognizer:gesture];\n    \n    objc_setAssociatedObject(view, (__bridge const void *)(kCEPinchGestureKey), gesture,OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n}\n\n- (CGFloat)completionSpeed\n{\n    return 1 - self.percentComplete;\n}\n\n- (void)handleGesture:(UIPinchGestureRecognizer*)gestureRecognizer {\n    \n    switch (gestureRecognizer.state) {\n        case UIGestureRecognizerStateBegan:\n            _startScale = gestureRecognizer.scale;\n            \n            // start an interactive transition!\n            self.interactionInProgress = YES;\n            \n            // perform the required operation\n            if (_operation == CEInteractionOperationPop) {\n                [_viewController.navigationController popViewControllerAnimated:YES];\n            } else {\n                [_viewController dismissViewControllerAnimated:YES completion:nil];\n            }\n            break;\n        case UIGestureRecognizerStateChanged: {\n            // compute the current pinch fraction\n            CGFloat fraction = 1.0 - gestureRecognizer.scale / _startScale;\n            _shouldCompleteTransition = (fraction > 0.5);\n            [self updateInteractiveTransition:fraction];\n            break;\n        }\n        case UIGestureRecognizerStateEnded:\n        case UIGestureRecognizerStateCancelled:\n            self.interactionInProgress = NO;\n            if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) {\n                [self cancelInteractiveTransition];\n            }\n            else {\n                [self finishInteractiveTransition];\n            }\n            break;\n        default:\n            break;\n    }\n}\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEVerticalSwipeInteractionController.h",
    "content": "//\n//  CEVerticalSwipeInteactionController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 22/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEBaseInteractionController.h\"\n\n/**\n A horizontal swipe interaction controller. When used with a navigation controller, a top-to-bottom swipe\n will cause a 'pop' navigation. This interaction controller cannot be used with a tabbar controller. That would be silly.\n */\n@interface CEVerticalSwipeInteractionController : CEBaseInteractionController\n\n@end\n"
  },
  {
    "path": "InteractionControllers/CEVerticalSwipeInteractionController.m",
    "content": "//\n//  CEVerticalSwipeInteactionController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 22/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"CEVerticalSwipeInteractionController.h\"\n#import <objc/runtime.h>\n\nconst NSString *kCEVerticalSwipeGestureKey = @\"kCEVerticalSwipeGestureKey\";\n\n@implementation CEVerticalSwipeInteractionController {\n    BOOL _shouldCompleteTransition;\n    UIViewController *_viewController;\n    CEInteractionOperation _operation;\n}\n\n\n- (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{\n    \n    if (operation == CEInteractionOperationTab) {\n        @throw [NSException exceptionWithName:NSInternalInconsistencyException\n                                       reason:@\"You cannot use a vertical swipe interaction with a tabbar controller - that would be silly!\"\n                                     userInfo:nil];\n    }\n    _operation = operation;\n    _viewController = viewController;\n    [self prepareGestureRecognizerInView:viewController.view];\n}\n\n\n- (void)prepareGestureRecognizerInView:(UIView*)view {\n    UIPanGestureRecognizer *gesture = objc_getAssociatedObject(view, (__bridge const void *)(kCEVerticalSwipeGestureKey));\n    \n    if (gesture) {\n        [view removeGestureRecognizer:gesture];\n    }\n \n    gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];\n    [view addGestureRecognizer:gesture];\n    \n    objc_setAssociatedObject(view, (__bridge const void *)(kCEVerticalSwipeGestureKey), gesture,OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n}\n\n- (CGFloat)completionSpeed\n{\n    return 1 - self.percentComplete;\n}\n\n- (void)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer {\n    CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view.superview];\n    \n    switch (gestureRecognizer.state) {\n        case UIGestureRecognizerStateBegan: {\n            \n            BOOL topToBottomSwipe = translation.y > 0;\n            \n            // perform the required navigation operation ...\n            \n            if (_operation == CEInteractionOperationPop) {\n                // for pop operation, fire on top-to-bottom\n                if (topToBottomSwipe) {\n                    self.interactionInProgress = YES;\n                    [_viewController.navigationController popViewControllerAnimated:YES];\n                }\n            } else {\n                // for dismiss, fire regardless of the translation direction\n                self.interactionInProgress = YES;\n                [_viewController dismissViewControllerAnimated:YES completion:nil];\n            }\n            break;\n        }\n        case UIGestureRecognizerStateChanged: {\n            if (self.interactionInProgress) {\n                // compute the current position\n                CGFloat fraction = fabs(translation.y / 200.0);\n                fraction = fminf(fmaxf(fraction, 0.0), 1.0);\n                _shouldCompleteTransition = (fraction > 0.5);\n                \n                // if an interactive transitions is 100% completed via the user interaction, for some reason\n                // the animation completion block is not called, and hence the transition is not completed.\n                // This glorious hack makes sure that this doesn't happen.\n                // see: https://github.com/ColinEberhardt/VCTransitionsLibrary/issues/4\n                if (fraction >= 1.0)\n                    fraction = 0.99;\n                \n                [self updateInteractiveTransition:fraction];\n            }\n            break;\n        }\n        case UIGestureRecognizerStateEnded:\n        case UIGestureRecognizerStateCancelled:\n            if (self.interactionInProgress) {\n                self.interactionInProgress = NO;\n                if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) {\n                    [self cancelInteractiveTransition];\n                }\n                else {\n                    [self finishInteractiveTransition];\n                }\n            }\n            break;\n        default:\n            break;\n    }\n}\n\n@end\n"
  },
  {
    "path": "MIT-LICENSE.txt",
    "content": "Copyright 2013 Colin Eberhardt\nLinq to Objective-C\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# View Controller Transitions Library\n\nWith iOS 7 you can easily create custom view controller transitions that can be used in a range of contexts (push, pop, modal …). This project provides a library of custom animations which can be dropped directly into your project. It also has a number of 'interaction controllers' which can be used with any of the custom animations in order to make your transitions interactive.\n\nThe library currently contains the following animations, which can be made interactive with either a swipe or pinch gesture.\n \n<table>\n<tr>\n<th>Flip</th>\n<th>Fold</th>\n<th>Crossfade</th>\n<th>Explode</th>\n</tr>\n<tr>\n<td><img src=\"Screenshots/thumbnails/Flip/1.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/Fold/2.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/Crossfade/2.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/Explode/2.png\"/></td>\n</tr>\n<tr>\n<th>Turn</th>\n<th>Cards</th>\n<th>NatGeo</th>\n<th>Portal</th>\n</tr>\n<tr>\n<td><img src=\"Screenshots/thumbnails/Turn/1a.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/Cards/2.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/NatGeo/2.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/Portal/3.png\"/></td>\n</tr>\n<tr>\n<th>Cube</th>\n<th>Pan</th>\n<th></th>\n<th></th>\n</tr>\n<tr>\n<td><img src=\"Screenshots/thumbnails/Cube/2.png\"/></td>\n<td><img src=\"Screenshots/thumbnails/Pan/pan_2.png\"/></td>\n<td></td>\n<td></td>\n</tr>\n</table>\n\n## Contents\n\n * [A brief introduction to custom transitions](#a-brief-introduction-to-custom-transitions)\n * [Adding custom transitions to your project](#adding-custom-transitions-to-your-project)\n   * [Grabbing the code](#grabbing-the-code)\n   * [Using an animation controller](#using-an-animation-controller)\n     * [Custom present / dismiss transitions](#custom-present--dismiss-transitions)\n     * [Custom navigation controller transitions](#custom-navigation-controller-transitions)\n     * [Custom tab bar controller transitions](#custom-tab-bar-controller-transitions)\n   * [Using an interaction controller](#using-an-interaction-controller)\n     * [Interactive dismiss transitions](#interactive-dismiss-transitions)\n     * [Interactive pop transitions](#interactive-pop-transitions)\n     * [Interactive tab transitions](#interactive-tab-transitions)\n * [Transitions library](#transitions-library)\n\n\n## A brief introduction to custom transitions\n\nThe following provides a very brief introduction to the concepts, for more detailed coverage I would thoroughly recommend reading Chapter 3 of [iOS 7 By Tutorials](http://www.raywenderlich.com/store/ios-7-by-tutorials?source=ceberhardt) - which I wrote! (I've heard the other 15 chapters are pretty good too ;-)\n\nThere are two key classes involved in a custom transition:\n\n + **Animation controller** - this class is responsible for performing the custom transitions. When you indicate that a custom transitions should be used, you provide an animation controller. This class performs the required animation, then informs the framework when it has completed.\n + **Interaction controller** - this class is responsible for managing interactive transitions - these are transitions that typically controlled by a gesture, allowing the user to swipe, pinch or perform some other action to navigate between view controllers. Importantly, interaction controllers allow transitions to be cancelled, i.e. a user can start the navigation, change their mind, and reverse it!\n \n**NOTE:** Animation and interaction controllers are entirely independent, this means you can wire up any interaction controller with any animation controller - which is pretty awesome.\n \n## <a id=\"intro\"></a>Adding custom transitions to your project\n\nThis sections gives a brief overview of the steps required to add custom view controller transitions to your project. You might also want to look at the code for the demo app (in the `TransitionsDemo` folder) for reference. If you already know how the iOS 7 custom view controller transitions work, feel free to skip this section!\n\n### <a id=\"grabbing\"></a>Grabbing the code\n\nThere are a couple of ways you can incorporate transitions from this library into your code:\n\n 1. **CocoaPods** - simply add a reference to **VCTransitionsLibrary** to your pod file.\n 2. **Manual file copy** - if you are not using CocoaPods, you can simply copy the required files into your project. The `AnimationControllers` and `InteractionControllers` folders contain all the code that is required.\n \n### <a id=\"animation\"></a>Using an animation controller\n\nThe `AnimationControllers` folder contains a number of animate controllers, which provide custom transitions, which can be integrated into your project as follows:\n\n#### <a id=\"animationPresent\"></a>Custom present / dismiss transitions\n\nThe `UIViewControllerTransitioningDelegate` protocol is used to supply animation controllers for present / dismiss transitions. When a view controller is presented or dismissed the `transitioningDelegate` property of the view controller being presented or dismissed is used to supply this delegate. Simply return one of the animation controllers in response to the `animationControllerForPresentedController: presentingController: sourceController:` message for presenting, and `animationControllerForDismissedController:` for dismissing.\n\n#### <a id=\"animationNavigation\"></a>Custom navigation controller transitions\n\nThe `UINavigationControllerDelegate` protocol has methods that can be used to provide animation controllers. Simply return an animation controller in response to the `navigationController: animationControllerForOperation: fromViewController: toViewController:` message.\n\nNotice that this message has an 'operation' argument that allows you to return different animations for push and pop operations. All of the animation controllers in this library subclass `CEReversibleAnimationController` which allows you to play the animation in reverse. This is commonly used in conjunction with the navigation controller as follows:\n\n```objc\n- (id<UIViewControllerAnimatedTransitioning>)navigationController:\n                                (UINavigationController *)navigationController\n   animationControllerForOperation:(UINavigationControllerOperation)operation\n                fromViewController:(UIViewController *)fromVC\n                  toViewController:(UIViewController *)toVC {\n    \n    // reverse the animation for 'pop' transitions\n    _animationController.reverse = operation == UINavigationControllerOperationPop;\n    \n    return _animationController;\n}\n```\n\n#### <a id=\"animationTab\"></a>Custom tab bar controller transitions\n\nThe `UITabBarControllerDelegate` protocol has methods that can be used to provide animation controllers. Simply return an animation controller in response to the `tabBarController: animationControllerForTransitionFromViewController: toViewController:` \nmessage.\n\nIn order to determine the animation direction, you can compare the indices of the two view controller as shown below:\n\n```objc\n- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController\n            animationControllerForTransitionFromViewController:(UIViewController *)fromVC\n                                              toViewController:(UIViewController *)toVC {\n    \n    NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];\n    NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];\n    \n    _animationController.reverse = fromVCIndex < toVCIndex;\n    return _animationController;\n}\n```\n\n\n### <a id=\"interaction\"></a>Using an interaction controller\n\nInteraction controllers work in conjunction with an animation controller in order to make a transitions interactive, i.e. allow a user to control a transitions using gestures. This interactivity allows a use to move forwards, backwards and even cancel a transitions.\n\nThe interaction controller is responsible for adding gesture recognisers to the view and triggering the navigation in response to gestures from the user.\n\n#### <a id=\"interactionDismiss\"></a>Interactive dismiss transitions\n\nThe `UIViewControllerTransitioningDelegate` protocol that is used to supply animation controllers is also used to supply interaction controllers. An example implementation, that uses a swipe interaction together with a flip animation, is show below:\n\n```objc\n// instance variables, typically instantiated in your init method\nCEFlipAnimationController *_animationController;\nCESwipeInteractionController *_interactionController;\n\n- (id<UIViewControllerAnimatedTransitioning>)\n      animationControllerForPresentedController:(UIViewController *)presented\n                           presentingController:(UIViewController *)presenting\n                               sourceController:(UIViewController *)source {\n    \n    // allow the interaction controller to wire-up its gesture recognisers\n    [_interactionController wireToViewController:presented \n                                    forOperation:CEInteractionOperationDismiss];\n       _animationController.reverse = NO;\n    return _animationController;\n}\n\n- (id<UIViewControllerAnimatedTransitioning>)\n     animationControllerForDismissedController:(UIViewController *)dismissed {\n    _animationController.reverse = YES;\n    return _animationController;\n}\n\n- (id<UIViewControllerInteractiveTransitioning>)\n           interactionControllerForDismissal:\n                (id<UIViewControllerAnimatedTransitioning>)animator {\n                \n    // provide the interaction controller, if an interactive transition is in progress\n    return _interactionController.interactionInProgress\n                ? _interactionController : nil;\n}\n```\n\nNote that in the above code the `interactionInProgress` property of the interaction controller is checked. This is because your might want to allow the user to dismiss the view controller using a button as well as via an interaction. Also, you must tell the interaction controller the operation it should perform (i.e. pop, dismiss).\n\n#### <a id=\"interactionPop\"></a>Interactive pop transitions\n\nThe `UINavigationControllerDelegate` protocol also has an equivalent method for returning interactions controllers. A typically implementation, which follows the same pattern as above, is shown:\n\n```objc\n// instance variables, typically instantiated in your init method\nCEFlipAnimationController *_animationController;\nCESwipeInteractionController *_interactionController;\n\n- (id<UIViewControllerAnimatedTransitioning>)\n                 navigationController:(UINavigationController *)navigationController\n      animationControllerForOperation:(UINavigationControllerOperation)operation\n                   fromViewController:(UIViewController *)fromVC\n                     toViewController:(UIViewController *)toVC {\n    \n    // wire the interaction controller to the to- view controller\n    [_interactionController wireToViewController:toVC\n                                    forOperation:CEInteractionOperationPop];\n    \n    _animationController.reverse = operation == UINavigationControllerOperationPop;\n    \n    return _animationController.reverse;\n}\n\n- (id <UIViewControllerInteractiveTransitioning>)\n                         navigationController:(UINavigationController *)navigationController \n  interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>)animationController {\n    \n    // provide the interaction controller, if an interactive transition is in progress\n    return _interactionController.interactionInProgress\n                ? _interactionController : nil;\n}\n```\n\n#### <a id=\"interactionPop\"></a>Interactive tab transitions\n\nThe `UITabBarControllerDelegate` protocol has an equivalent method for returning interactions controllers. As with the navigation controller example above, the interaction controller needs to add its gesture recognisers to the view controllers that the tab bar controller navigates between. Unfortunately the tab bar delegate methods don't get fired when the first view controller is presented, so I opt for a slightly messier implementation using Key-Value observing:\n\n```objc\n@implementation TabBarViewController {\n    CEFoldAnimationController *_animationController;\n    CESwipeInteractionController *_swipeInteractionController;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        self.delegate = self;\n        \n        // create the interaction / animation controllers\n        _swipeInteractionController = [CESwipeInteractionController new];\n        _animationController = [CEFoldAnimationController new];\n        _animationController.folds = 3;\n        \n        // observe changes in the currently presented view controller\n        [self addObserver:self\n               forKeyPath:@\"selectedViewController\"\n                  options:NSKeyValueObservingOptionNew\n                  context:nil];\n    }\n    return self;\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object\n                        change:(NSDictionary *)change\n                       context:(void *)context\n{\n    if ([keyPath isEqualToString:@\"selectedViewController\"] )\n    {\n    \t// wire the interaction controller to the view controller\n        [_swipeInteractionController wireToViewController:self.selectedViewController\n                                             forOperation:CEInteractionOperationTab];\n    }\n}\n\n\n\n- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController\n            animationControllerForTransitionFromViewController:(UIViewController *)fromVC\n                                              toViewController:(UIViewController *)toVC {\n    \n    NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];\n    NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];\n    \n    _animationController.reverse = fromVCIndex < toVCIndex;\n    return _animationController;\n}\n\n-(id<UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController\n{\n    return _swipeInteractionController.interactionInProgress ? _swipeInteractionController : nil;\n}\n\n@end\n```\n\n## <a id=\"library\"></a>Transitions Library\n\nThe following is a graphical illustration of the various transitions. All animation controllers have a `duration` property that configures the animation duration.\n\n### Fold animation - CEFoldAnimationController\n\nAnimates between the two view controllers using a paper-fold style transition. You can configure the number of folds via the `folds` property.\n\n![](Screenshots/thumbnails/Fold/1.png)\n![](Screenshots/thumbnails/Fold/2.png)\n![](Screenshots/thumbnails/Fold/3.png)\n![](Screenshots/thumbnails/Fold/4.png)\n\n### Flip animation - CEFlipAnimationController\n\nAnimates between the two view controllers using a page-flip transition. \n\n![](Screenshots/thumbnails/Flip/1.png)\n![](Screenshots/thumbnails/Flip/2.png)\n![](Screenshots/thumbnails/Flip/3.png)\n![](Screenshots/thumbnails/Flip/4.png)\n\n### NatGeo animation - CENatGeoAnimationController\n\nAnimates between the two view controllers using transition inspired by [City Guides by National Geographic](https://itunes.apple.com/us/app/city-guides-by-national-geographic/id592453480?mt=8).\nIt's an adoptation of [MHNatGeoViewControllerTransition](https://github.com/michaelhenry/MHNatGeoViewControllerTransition/) to iOS7 APIs.\n\n![](Screenshots/thumbnails/NatGeo/1.png)\n![](Screenshots/thumbnails/NatGeo/2.png)\n![](Screenshots/thumbnails/NatGeo/3.png)\n![](Screenshots/thumbnails/NatGeo/4.png)\n\n### Turn animation - CETurnAnimationController\n\nAnimates between the two view controllers by performing a 3D flip, to reveal the destination view on the back.The turn animation has a `flipDirection` property that specifies the turn orientation.\n\n![](Screenshots/thumbnails/Turn/1.png)\n![](Screenshots/thumbnails/Turn/2.png)\n![](Screenshots/thumbnails/Turn/3.png)\n![](Screenshots/thumbnails/Turn/4.png)\n\n![](Screenshots/thumbnails/Turn/1a.png)\n![](Screenshots/thumbnails/Turn/2a.png)\n![](Screenshots/thumbnails/Turn/3a.png)\n![](Screenshots/thumbnails/Turn/4a.png)\n\n### Crossfade animation - CECrossfadeAnimationController\n\nAnimates between the two view controllers by performing a simple cross-fade. \n\n![](Screenshots/thumbnails/Crossfade/1.png)\n![](Screenshots/thumbnails/Crossfade/2.png)\n![](Screenshots/thumbnails/Crossfade/3.png)\n![](Screenshots/thumbnails/Crossfade/4.png)\n\n### Explode animation - CEExplodeAnimationController\n\nAnimates between the two view controllers by slicing the from- view controller into lots of little pieces, then randomly spinning and shrinking them.\n\n![](Screenshots/thumbnails/Explode/1.png)\n![](Screenshots/thumbnails/Explode/2.png)\n![](Screenshots/thumbnails/Explode/3.png)\n![](Screenshots/thumbnails/Explode/4.png)\n\n### Cards animation - CECardsAnimationController\n\nGives the impression of one view controller pushing the other to the back. It looks a lot more cool than these static screenshots!\n\n(courtesy of Tope - AppDesignVault)\n\n![](Screenshots/thumbnails/Cards/1.png)\n![](Screenshots/thumbnails/Cards/2.png)\n![](Screenshots/thumbnails/Cards/3.png)\n![](Screenshots/thumbnails/Cards/4.png)\n\n### Portal animation - CEPortalAnimationController\n\nThe top-most view controller parts in the middle to reveal the view controller beneath.\n\n(courtesy of [FreddyF](https://github.com/FredddyF))\n\n![](Screenshots/thumbnails/Portal/4.png)\n![](Screenshots/thumbnails/Portal/3.png)\n![](Screenshots/thumbnails/Portal/2.png)\n![](Screenshots/thumbnails/Portal/1.png)\n\n### Cube animation - CECubeAnimationController\n\nThis transition gives the appearance of rotating the faces of a cube.\n\n(courtesy of [Andrés Brun](https://github.com/andresbrun))\n\n![](Screenshots/thumbnails/Cube/4.png)\n![](Screenshots/thumbnails/Cube/3.png)\n![](Screenshots/thumbnails/Cube/2.png)\n![](Screenshots/thumbnails/Cube/1.png)\n\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 17/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 17/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n    // Override point for customization after application launch.\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/Base.lproj/Main_iPad.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"4451\" systemVersion=\"13A461\" targetRuntime=\"iOS.CocoaTouch.iPad\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"3676\"/>\n    </dependencies>\n    <scenes>\n        <!--class Prefix:identifier View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"768\" height=\"1004\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\" statusBarStyle=\"blackOpaque\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\"/>\n    </simulatedMetricsContainer>\n</document>"
  },
  {
    "path": "TabBarDemo/TabBarDemo/Base.lproj/Main_iPhone.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"4510\" systemVersion=\"12E55\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" initialViewController=\"6kb-xr-qZa\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"3742\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller - Item 1-->\n        <scene sceneID=\"9VI-vG-8Kg\">\n            <objects>\n                <viewController id=\"Hsq-g1-dma\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"oTJ-bG-fZW\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <view alpha=\"0.59999999999999998\" contentMode=\"scaleToFill\" id=\"Qtj-8G-hhH\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"280\" height=\"472\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                            </view>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" id=\"zui-vk-apM\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"280\" height=\"472\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                <mutableString key=\"text\">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.\n\nLorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation .</mutableString>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.098272695980000005\" green=\"1\" blue=\"0.082673679589999993\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"Item 1\" id=\"dN4-tK-Kqe\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"gum-f6-WxE\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-29\" y=\"-434\"/>\n        </scene>\n        <!--Tab Bar View Controller-->\n        <scene sceneID=\"geY-Kb-z6y\">\n            <objects>\n                <tabBarController definesPresentationContext=\"YES\" id=\"6kb-xr-qZa\" customClass=\"TabBarViewController\" sceneMemberID=\"viewController\">\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" id=\"V0A-Sw-s6s\">\n                        <rect key=\"frame\" x=\"129\" y=\"330\" width=\"163\" height=\"49\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMinY=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    </tabBar>\n                    <connections>\n                        <segue destination=\"Hsq-g1-dma\" kind=\"relationship\" relationship=\"viewControllers\" id=\"qWu-cX-sEq\"/>\n                        <segue destination=\"bRO-k6-eZk\" kind=\"relationship\" relationship=\"viewControllers\" id=\"klS-z2-jJY\"/>\n                        <segue destination=\"fES-VD-xXB\" kind=\"relationship\" relationship=\"viewControllers\" id=\"VOH-9J-6o9\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"yY6-J3-Pid\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-571\" y=\"405\"/>\n        </scene>\n        <!--View Controller - Item 2-->\n        <scene sceneID=\"Xz0-FP-6cF\">\n            <objects>\n                <viewController id=\"bRO-k6-eZk\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"zF7-yI-pQT\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <view alpha=\"0.60000002384185791\" contentMode=\"scaleToFill\" id=\"74T-ps-02X\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"280\" height=\"472\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                            </view>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" id=\"mMF-qI-3ZM\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"280\" height=\"472\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                <mutableString key=\"text\">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.\n\nLorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation .</mutableString>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"0.018977788870000002\" blue=\"0.040716178679999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"Item 2\" id=\"bex-zd-Ce4\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"PYr-Hp-OPZ\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"11\" y=\"411\"/>\n        </scene>\n        <!--View Controller - Item 3-->\n        <scene sceneID=\"nP6-l0-ZF2\">\n            <objects>\n                <viewController id=\"fES-VD-xXB\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"gID-bm-ZHa\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <view alpha=\"0.60000002384185791\" contentMode=\"scaleToFill\" id=\"SPP-m3-ti0\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"280\" height=\"472\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                            </view>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" id=\"7f7-eb-fnJ\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"280\" height=\"472\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                <mutableString key=\"text\">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.\n\nLorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation .</mutableString>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"0.5\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"Item 3\" id=\"OYX-34-W8p\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Z5b-iG-OdP\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"36\" y=\"1193\"/>\n        </scene>\n    </scenes>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\" type=\"retina4\"/>\n    </simulatedMetricsContainer>\n</document>"
  },
  {
    "path": "TabBarDemo/TabBarDemo/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "TabBarDemo/TabBarDemo/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "TabBarDemo/TabBarDemo/TabBarDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.scottlogic.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main_iPhone</string>\n\t<key>UIMainStoryboardFile~ipad</key>\n\t<string>Main_iPad</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/TabBarDemo-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_5_0\n#warning \"This project uses features only available in iOS SDK 5.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    #import <UIKit/UIKit.h>\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/TabBarViewController.h",
    "content": "//\n//  TabBarViewController.h\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 18/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface TabBarViewController : UITabBarController\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/TabBarViewController.m",
    "content": "//\n//  TabBarViewController.m\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 18/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"TabBarViewController.h\"\n#import \"CEFoldAnimationController.h\"\n#import \"CEHorizontalSwipeInteractionController.h\"\n\n@interface TabBarViewController () <UITabBarControllerDelegate>\n\n@end\n\n@implementation TabBarViewController {\n    CEFoldAnimationController *_animationController;\n    CEHorizontalSwipeInteractionController *_swipeInteractionController;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        self.delegate = self;\n        \n        // create the interaction / animation controllers\n        _swipeInteractionController = [CEHorizontalSwipeInteractionController new];\n        _animationController = [CEFoldAnimationController new];\n        _animationController.folds = 3;\n        \n        // observe changes in the currently presented view controller\n        [self addObserver:self\n               forKeyPath:@\"selectedViewController\"\n                  options:NSKeyValueObservingOptionNew\n                  context:nil];\n    }\n    return self;\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object\n                        change:(NSDictionary *)change\n                       context:(void *)context\n{\n    if ([keyPath isEqualToString:@\"selectedViewController\"] )\n    {\n    \t// wire the interaction controller to the view controller\n        [_swipeInteractionController wireToViewController:self.selectedViewController\n                                             forOperation:CEInteractionOperationTab];\n    }\n}\n\n\n\n- (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController\n            animationControllerForTransitionFromViewController:(UIViewController *)fromVC\n                                              toViewController:(UIViewController *)toVC {\n    \n    NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];\n    NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];\n    \n    _animationController.reverse = fromVCIndex < toVCIndex;\n    return _animationController;\n}\n\n-(id<UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController\n{\n    return _swipeInteractionController.interactionInProgress ? _swipeInteractionController : nil;\n}\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/ViewController.h",
    "content": "//\n//  ViewController.h\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 17/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface ViewController : UIViewController\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/ViewController.m",
    "content": "//\n//  ViewController.m\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 17/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"ViewController.h\"\n\n@interface ViewController ()\n\n@end\n\n@implementation ViewController\n\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo/main.m",
    "content": "//\n//  main.m\n//  TabBarDemo\n//\n//  Created by Colin Eberhardt on 17/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[])\n{\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t72EC05B717E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */; };\n\t\t72EC05B917E8DF3D00DCB9A3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05B817E8DF3D00DCB9A3 /* CoreGraphics.framework */; };\n\t\t72EC05BB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */; };\n\t\t72EC05C117E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05BF17E8DF3D00DCB9A3 /* InfoPlist.strings */; };\n\t\t72EC05C317E8DF3D00DCB9A3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05C217E8DF3D00DCB9A3 /* main.m */; };\n\t\t72EC05C717E8DF3D00DCB9A3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05C617E8DF3D00DCB9A3 /* AppDelegate.m */; };\n\t\t72EC05CA17E8DF3D00DCB9A3 /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05C817E8DF3D00DCB9A3 /* Main_iPhone.storyboard */; };\n\t\t72EC05CD17E8DF3D00DCB9A3 /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05CB17E8DF3D00DCB9A3 /* Main_iPad.storyboard */; };\n\t\t72EC05D017E8DF3D00DCB9A3 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05CF17E8DF3D00DCB9A3 /* ViewController.m */; };\n\t\t72EC05D217E8DF3D00DCB9A3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05D117E8DF3D00DCB9A3 /* Images.xcassets */; };\n\t\t72EC05D917E8DF3D00DCB9A3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05D817E8DF3D00DCB9A3 /* XCTest.framework */; };\n\t\t72EC05DA17E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */; };\n\t\t72EC05DB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */; };\n\t\t72EC05E317E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05E117E8DF3D00DCB9A3 /* InfoPlist.strings */; };\n\t\t72EC05E517E8DF3D00DCB9A3 /* TabBarDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05E417E8DF3D00DCB9A3 /* TabBarDemoTests.m */; };\n\t\t72EC05FB17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F517E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m */; };\n\t\t72EC05FC17E8DF5D00DCB9A3 /* CEExplodeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F617E8DF5D00DCB9A3 /* CEExplodeAnimationController.m */; };\n\t\t72EC05FD17E8DF5D00DCB9A3 /* CEFlipAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F717E8DF5D00DCB9A3 /* CEFlipAnimationController.m */; };\n\t\t72EC05FE17E8DF5D00DCB9A3 /* CEFoldAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F817E8DF5D00DCB9A3 /* CEFoldAnimationController.m */; };\n\t\t72EC05FF17E8DF5D00DCB9A3 /* CEReversibleAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F917E8DF5D00DCB9A3 /* CEReversibleAnimationController.m */; };\n\t\t72EC060017E8DF5D00DCB9A3 /* CETurnAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */; };\n\t\t72EC060317E9655300DCB9A3 /* TabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060217E9655300DCB9A3 /* TabBarViewController.m */; };\n\t\t72EC060917E96C2500DCB9A3 /* CEBaseInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */; };\n\t\t72EE96DE17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t72EC05DC17E8DF3D00DCB9A3 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 72EC05AB17E8DF3D00DCB9A3 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 72EC05B217E8DF3D00DCB9A3;\n\t\t\tremoteInfo = TabBarDemo;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t72EC05B317E8DF3D00DCB9A3 /* TabBarDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabBarDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t72EC05B817E8DF3D00DCB9A3 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t72EC05BE17E8DF3D00DCB9A3 /* TabBarDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"TabBarDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t72EC05C017E8DF3D00DCB9A3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t72EC05C217E8DF3D00DCB9A3 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t72EC05C417E8DF3D00DCB9A3 /* TabBarDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"TabBarDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t72EC05C517E8DF3D00DCB9A3 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t72EC05C617E8DF3D00DCB9A3 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t72EC05C917E8DF3D00DCB9A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = \"<group>\"; };\n\t\t72EC05CC17E8DF3D00DCB9A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPad.storyboard; sourceTree = \"<group>\"; };\n\t\t72EC05CE17E8DF3D00DCB9A3 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = \"<group>\"; };\n\t\t72EC05CF17E8DF3D00DCB9A3 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = \"<group>\"; };\n\t\t72EC05D117E8DF3D00DCB9A3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t72EC05D717E8DF3D00DCB9A3 /* TabBarDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TabBarDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t72EC05D817E8DF3D00DCB9A3 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\t72EC05E017E8DF3D00DCB9A3 /* TabBarDemoTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"TabBarDemoTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t72EC05E217E8DF3D00DCB9A3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t72EC05E417E8DF3D00DCB9A3 /* TabBarDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TabBarDemoTests.m; sourceTree = \"<group>\"; };\n\t\t72EC05EF17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CECrossfadeAnimationController.h; path = ../AnimationControllers/CECrossfadeAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EC05F017E8DF5D00DCB9A3 /* CEExplodeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEExplodeAnimationController.h; path = ../AnimationControllers/CEExplodeAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EC05F117E8DF5D00DCB9A3 /* CEFlipAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEFlipAnimationController.h; path = ../AnimationControllers/CEFlipAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EC05F217E8DF5D00DCB9A3 /* CEFoldAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEFoldAnimationController.h; path = ../AnimationControllers/CEFoldAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EC05F317E8DF5D00DCB9A3 /* CEReversibleAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEReversibleAnimationController.h; path = ../AnimationControllers/CEReversibleAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EC05F417E8DF5D00DCB9A3 /* CETurnAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CETurnAnimationController.h; path = ../AnimationControllers/CETurnAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EC05F517E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CECrossfadeAnimationController.m; path = ../AnimationControllers/CECrossfadeAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC05F617E8DF5D00DCB9A3 /* CEExplodeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEExplodeAnimationController.m; path = ../AnimationControllers/CEExplodeAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC05F717E8DF5D00DCB9A3 /* CEFlipAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEFlipAnimationController.m; path = ../AnimationControllers/CEFlipAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC05F817E8DF5D00DCB9A3 /* CEFoldAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEFoldAnimationController.m; path = ../AnimationControllers/CEFoldAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC05F917E8DF5D00DCB9A3 /* CEReversibleAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEReversibleAnimationController.m; path = ../AnimationControllers/CEReversibleAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CETurnAnimationController.m; path = ../AnimationControllers/CETurnAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC060117E9655300DCB9A3 /* TabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarViewController.h; sourceTree = \"<group>\"; };\n\t\t72EC060217E9655300DCB9A3 /* TabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabBarViewController.m; sourceTree = \"<group>\"; };\n\t\t72EC060517E96C2500DCB9A3 /* CEBaseInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEBaseInteractionController.h; path = ../InteractionControllers/CEBaseInteractionController.h; sourceTree = \"<group>\"; };\n\t\t72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEBaseInteractionController.m; path = ../InteractionControllers/CEBaseInteractionController.m; sourceTree = \"<group>\"; };\n\t\t72EE96DC17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEHorizontalSwipeInteractionController.h; path = ../InteractionControllers/CEHorizontalSwipeInteractionController.h; sourceTree = \"<group>\"; };\n\t\t72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEHorizontalSwipeInteractionController.m; path = ../InteractionControllers/CEHorizontalSwipeInteractionController.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t72EC05B017E8DF3D00DCB9A3 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t72EC05B917E8DF3D00DCB9A3 /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t72EC05BB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */,\n\t\t\t\t72EC05B717E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t72EC05D417E8DF3D00DCB9A3 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t72EC05D917E8DF3D00DCB9A3 /* XCTest.framework in Frameworks */,\n\t\t\t\t72EC05DB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */,\n\t\t\t\t72EC05DA17E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t72EC05AA17E8DF3D00DCB9A3 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC060417E96C0C00DCB9A3 /* InteractionControllers */,\n\t\t\t\t72EC05EE17E8DF4A00DCB9A3 /* AnimationControllers */,\n\t\t\t\t72EC05BC17E8DF3D00DCB9A3 /* TabBarDemo */,\n\t\t\t\t72EC05DE17E8DF3D00DCB9A3 /* TabBarDemoTests */,\n\t\t\t\t72EC05B517E8DF3D00DCB9A3 /* Frameworks */,\n\t\t\t\t72EC05B417E8DF3D00DCB9A3 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05B417E8DF3D00DCB9A3 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05B317E8DF3D00DCB9A3 /* TabBarDemo.app */,\n\t\t\t\t72EC05D717E8DF3D00DCB9A3 /* TabBarDemoTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05B517E8DF3D00DCB9A3 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */,\n\t\t\t\t72EC05B817E8DF3D00DCB9A3 /* CoreGraphics.framework */,\n\t\t\t\t72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */,\n\t\t\t\t72EC05D817E8DF3D00DCB9A3 /* XCTest.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05BC17E8DF3D00DCB9A3 /* TabBarDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05C517E8DF3D00DCB9A3 /* AppDelegate.h */,\n\t\t\t\t72EC05C617E8DF3D00DCB9A3 /* AppDelegate.m */,\n\t\t\t\t72EC05C817E8DF3D00DCB9A3 /* Main_iPhone.storyboard */,\n\t\t\t\t72EC05CB17E8DF3D00DCB9A3 /* Main_iPad.storyboard */,\n\t\t\t\t72EC05CE17E8DF3D00DCB9A3 /* ViewController.h */,\n\t\t\t\t72EC05CF17E8DF3D00DCB9A3 /* ViewController.m */,\n\t\t\t\t72EC05D117E8DF3D00DCB9A3 /* Images.xcassets */,\n\t\t\t\t72EC05BD17E8DF3D00DCB9A3 /* Supporting Files */,\n\t\t\t\t72EC060117E9655300DCB9A3 /* TabBarViewController.h */,\n\t\t\t\t72EC060217E9655300DCB9A3 /* TabBarViewController.m */,\n\t\t\t);\n\t\t\tpath = TabBarDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05BD17E8DF3D00DCB9A3 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05BE17E8DF3D00DCB9A3 /* TabBarDemo-Info.plist */,\n\t\t\t\t72EC05BF17E8DF3D00DCB9A3 /* InfoPlist.strings */,\n\t\t\t\t72EC05C217E8DF3D00DCB9A3 /* main.m */,\n\t\t\t\t72EC05C417E8DF3D00DCB9A3 /* TabBarDemo-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05DE17E8DF3D00DCB9A3 /* TabBarDemoTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05E417E8DF3D00DCB9A3 /* TabBarDemoTests.m */,\n\t\t\t\t72EC05DF17E8DF3D00DCB9A3 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = TabBarDemoTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05DF17E8DF3D00DCB9A3 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05E017E8DF3D00DCB9A3 /* TabBarDemoTests-Info.plist */,\n\t\t\t\t72EC05E117E8DF3D00DCB9A3 /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05EE17E8DF4A00DCB9A3 /* AnimationControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05EF17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.h */,\n\t\t\t\t72EC05F517E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m */,\n\t\t\t\t72EC05F017E8DF5D00DCB9A3 /* CEExplodeAnimationController.h */,\n\t\t\t\t72EC05F617E8DF5D00DCB9A3 /* CEExplodeAnimationController.m */,\n\t\t\t\t72EC05F117E8DF5D00DCB9A3 /* CEFlipAnimationController.h */,\n\t\t\t\t72EC05F717E8DF5D00DCB9A3 /* CEFlipAnimationController.m */,\n\t\t\t\t72EC05F217E8DF5D00DCB9A3 /* CEFoldAnimationController.h */,\n\t\t\t\t72EC05F817E8DF5D00DCB9A3 /* CEFoldAnimationController.m */,\n\t\t\t\t72EC05F317E8DF5D00DCB9A3 /* CEReversibleAnimationController.h */,\n\t\t\t\t72EC05F917E8DF5D00DCB9A3 /* CEReversibleAnimationController.m */,\n\t\t\t\t72EC05F417E8DF5D00DCB9A3 /* CETurnAnimationController.h */,\n\t\t\t\t72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */,\n\t\t\t);\n\t\t\tname = AnimationControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC060417E96C0C00DCB9A3 /* InteractionControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t72EE96DC17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.h */,\n\t\t\t\t72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */,\n\t\t\t\t72EC060517E96C2500DCB9A3 /* CEBaseInteractionController.h */,\n\t\t\t\t72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */,\n\t\t\t);\n\t\t\tname = InteractionControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t72EC05B217E8DF3D00DCB9A3 /* TabBarDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 72EC05E817E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget \"TabBarDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t72EC05AF17E8DF3D00DCB9A3 /* Sources */,\n\t\t\t\t72EC05B017E8DF3D00DCB9A3 /* Frameworks */,\n\t\t\t\t72EC05B117E8DF3D00DCB9A3 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TabBarDemo;\n\t\t\tproductName = TabBarDemo;\n\t\t\tproductReference = 72EC05B317E8DF3D00DCB9A3 /* TabBarDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t72EC05D617E8DF3D00DCB9A3 /* TabBarDemoTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 72EC05EB17E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget \"TabBarDemoTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t72EC05D317E8DF3D00DCB9A3 /* Sources */,\n\t\t\t\t72EC05D417E8DF3D00DCB9A3 /* Frameworks */,\n\t\t\t\t72EC05D517E8DF3D00DCB9A3 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t72EC05DD17E8DF3D00DCB9A3 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TabBarDemoTests;\n\t\t\tproductName = TabBarDemoTests;\n\t\t\tproductReference = 72EC05D717E8DF3D00DCB9A3 /* TabBarDemoTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t72EC05AB17E8DF3D00DCB9A3 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0500;\n\t\t\t\tORGANIZATIONNAME = \"Colin Eberhardt\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t72EC05D617E8DF3D00DCB9A3 = {\n\t\t\t\t\t\tTestTargetID = 72EC05B217E8DF3D00DCB9A3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 72EC05AE17E8DF3D00DCB9A3 /* Build configuration list for PBXProject \"TabBarDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 72EC05AA17E8DF3D00DCB9A3;\n\t\t\tproductRefGroup = 72EC05B417E8DF3D00DCB9A3 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t72EC05B217E8DF3D00DCB9A3 /* TabBarDemo */,\n\t\t\t\t72EC05D617E8DF3D00DCB9A3 /* TabBarDemoTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t72EC05B117E8DF3D00DCB9A3 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t72EC05CD17E8DF3D00DCB9A3 /* Main_iPad.storyboard in Resources */,\n\t\t\t\t72EC05D217E8DF3D00DCB9A3 /* Images.xcassets in Resources */,\n\t\t\t\t72EC05CA17E8DF3D00DCB9A3 /* Main_iPhone.storyboard in Resources */,\n\t\t\t\t72EC05C117E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t72EC05D517E8DF3D00DCB9A3 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t72EC05E317E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t72EC05AF17E8DF3D00DCB9A3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t72EC060317E9655300DCB9A3 /* TabBarViewController.m in Sources */,\n\t\t\t\t72EE96DE17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m in Sources */,\n\t\t\t\t72EC05D017E8DF3D00DCB9A3 /* ViewController.m in Sources */,\n\t\t\t\t72EC05FF17E8DF5D00DCB9A3 /* CEReversibleAnimationController.m in Sources */,\n\t\t\t\t72EC05C717E8DF3D00DCB9A3 /* AppDelegate.m in Sources */,\n\t\t\t\t72EC060017E8DF5D00DCB9A3 /* CETurnAnimationController.m in Sources */,\n\t\t\t\t72EC05FB17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m in Sources */,\n\t\t\t\t72EC05FC17E8DF5D00DCB9A3 /* CEExplodeAnimationController.m in Sources */,\n\t\t\t\t72EC05C317E8DF3D00DCB9A3 /* main.m in Sources */,\n\t\t\t\t72EC060917E96C2500DCB9A3 /* CEBaseInteractionController.m in Sources */,\n\t\t\t\t72EC05FE17E8DF5D00DCB9A3 /* CEFoldAnimationController.m in Sources */,\n\t\t\t\t72EC05FD17E8DF5D00DCB9A3 /* CEFlipAnimationController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t72EC05D317E8DF3D00DCB9A3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t72EC05E517E8DF3D00DCB9A3 /* TabBarDemoTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t72EC05DD17E8DF3D00DCB9A3 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 72EC05B217E8DF3D00DCB9A3 /* TabBarDemo */;\n\t\t\ttargetProxy = 72EC05DC17E8DF3D00DCB9A3 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t72EC05BF17E8DF3D00DCB9A3 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05C017E8DF3D00DCB9A3 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05C817E8DF3D00DCB9A3 /* Main_iPhone.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05C917E8DF3D00DCB9A3 /* Base */,\n\t\t\t);\n\t\t\tname = Main_iPhone.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05CB17E8DF3D00DCB9A3 /* Main_iPad.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05CC17E8DF3D00DCB9A3 /* Base */,\n\t\t\t);\n\t\t\tname = Main_iPad.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t72EC05E117E8DF3D00DCB9A3 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t72EC05E217E8DF3D00DCB9A3 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t72EC05E617E8DF3D00DCB9A3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_INCLUDING_64_BIT)\";\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t72EC05E717E8DF3D00DCB9A3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_INCLUDING_64_BIT)\";\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t72EC05E917E8DF3D00DCB9A3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"TabBarDemo/TabBarDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"TabBarDemo/TabBarDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t72EC05EA17E8DF3D00DCB9A3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"TabBarDemo/TabBarDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"TabBarDemo/TabBarDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t72EC05EC17E8DF3D00DCB9A3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_INCLUDING_64_BIT)\";\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/TabBarDemo.app/TabBarDemo\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"TabBarDemo/TabBarDemo-Prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"TabBarDemoTests/TabBarDemoTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t72EC05ED17E8DF3D00DCB9A3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_INCLUDING_64_BIT)\";\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/TabBarDemo.app/TabBarDemo\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"TabBarDemo/TabBarDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"TabBarDemoTests/TabBarDemoTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t72EC05AE17E8DF3D00DCB9A3 /* Build configuration list for PBXProject \"TabBarDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t72EC05E617E8DF3D00DCB9A3 /* Debug */,\n\t\t\t\t72EC05E717E8DF3D00DCB9A3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t72EC05E817E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget \"TabBarDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t72EC05E917E8DF3D00DCB9A3 /* Debug */,\n\t\t\t\t72EC05EA17E8DF3D00DCB9A3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t72EC05EB17E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget \"TabBarDemoTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t72EC05EC17E8DF3D00DCB9A3 /* Debug */,\n\t\t\t\t72EC05ED17E8DF3D00DCB9A3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 72EC05AB17E8DF3D00DCB9A3 /* Project object */;\n}\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:TabBarDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "TabBarDemo/TabBarDemo.xcodeproj/project.xcworkspace/xcshareddata/TabBarDemo.xccheckout",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>1E84E93D-E2FA-4FCE-803F-2A2971E98742</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>TabBarDemo</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>C9B960E113CD2F1E13B17A07CE56CB3BD674F912</key>\n\t\t<string>https://github.com/cyndibaby905/VCTransitionsLibrary.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>TabBarDemo/TabBarDemo.xcodeproj</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>C9B960E113CD2F1E13B17A07CE56CB3BD674F912</key>\n\t\t<string>../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>https://github.com/cyndibaby905/VCTransitionsLibrary.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>111</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>C9B960E113CD2F1E13B17A07CE56CB3BD674F912</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>C9B960E113CD2F1E13B17A07CE56CB3BD674F912</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>VCTransitionsLibrary</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "TabBarDemo/TabBarDemoTests/TabBarDemoTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.scottlogic.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "TabBarDemo/TabBarDemoTests/TabBarDemoTests.m",
    "content": "//\n//  TabBarDemoTests.m\n//  TabBarDemoTests\n//\n//  Created by Colin Eberhardt on 17/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n\n@interface TabBarDemoTests : XCTestCase\n\n@end\n\n@implementation TabBarDemoTests\n\n- (void)setUp\n{\n    [super setUp];\n    // Put setup code here. This method is called before the invocation of each test method in the class.\n}\n\n- (void)tearDown\n{\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    [super tearDown];\n}\n\n- (void)testExample\n{\n    XCTFail(@\"No implementation for \\\"%s\\\"\", __PRETTY_FUNCTION__);\n}\n\n@end\n"
  },
  {
    "path": "TabBarDemo/TabBarDemoTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n// a macro for easy access to the singleton app-delegate. Yes, I know some people\n// consider the an anti-pattern, but this is just a simple test app, so let's\n// not stress about it? ;-)\n#define AppDelegateAccessor ((AppDelegate *)[[UIApplication sharedApplication] delegate])\n\n@class CEReversibleAnimationController, CEBaseInteractionController;\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@property (strong, nonatomic) CEReversibleAnimationController *settingsAnimationController;\n@property (strong, nonatomic) CEReversibleAnimationController *navigationControllerAnimationController;\n@property (strong, nonatomic) CEBaseInteractionController *navigationControllerInteractionController;\n@property (strong, nonatomic) CEBaseInteractionController *settingsInteractionController;\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n#import \"CECardsAnimationController.h\"\n#import \"CEVerticalSwipeInteractionController.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n    //AppDelegateAccessor.navigationControllerAnimationController = [CECardsAnimationController new];\n    //AppDelegateAccessor.navigationControllerInteractionController = [CEVerticalSwipeInteactionController new];\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/Base.lproj/Launch Screen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"8164.2\" systemVersion=\"14F27\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"8135.1\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/Base.lproj/Main_iPhone.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"4510\" systemVersion=\"12E55\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" initialViewController=\"Vwk-6U-LXd\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"3742\"/>\n    </dependencies>\n    <scenes>\n        <!--Navigation Controller-->\n        <scene sceneID=\"gwt-Vs-FTI\">\n            <objects>\n                <navigationController definesPresentationContext=\"YES\" id=\"Vwk-6U-LXd\" customClass=\"NavigationController\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"R7t-Hc-ZXp\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"8eK-ED-7Al\" kind=\"relationship\" relationship=\"rootViewController\" id=\"d91-WC-R0R\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"PGb-8e-L5W\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-214\" y=\"-107\"/>\n        </scene>\n        <!--View Controller - MyView-->\n        <scene sceneID=\"GTo-vm-bZl\">\n            <objects>\n                <viewController id=\"8eK-ED-7Al\" customClass=\"ViewController\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Nuo-ub-F7U\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <view alpha=\"0.65000000000000013\" contentMode=\"scaleToFill\" id=\"0Dq-OP-B7C\">\n                                <rect key=\"frame\" x=\"20\" y=\"82\" width=\"280\" height=\"428\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                            </view>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" id=\"j9n-2T-EF3\">\n                                <rect key=\"frame\" x=\"20\" y=\"82\" width=\"280\" height=\"428\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                <accessibility key=\"accessibilityConfiguration\">\n                                    <accessibilityTraits key=\"traits\" none=\"YES\" notEnabled=\"YES\"/>\n                                </accessibility>\n                                <string key=\"text\">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.\n\nLorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                            </textView>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" id=\"dl4-O8-EsA\">\n                                <rect key=\"frame\" x=\"254\" y=\"518\" width=\"46\" height=\"30\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMinY=\"YES\"/>\n                                <state key=\"normal\" title=\"Next\">\n                                    <color key=\"titleShadowColor\" white=\"0.5\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                </state>\n                                <connections>\n                                    <segue destination=\"8eK-ED-7Al\" kind=\"push\" id=\"cqb-gg-qYl\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"MyView\" id=\"Dnh-wc-MG1\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Settings\" id=\"uCX-xc-klL\">\n                            <connections>\n                                <segue destination=\"4TF-hz-OQ8\" kind=\"modal\" identifier=\"ShowSettings\" id=\"ixC-z2-ySi\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"0B6-2O-8G9\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"281\" y=\"-107\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"uxG-dZ-NkL\">\n            <objects>\n                <navigationController definesPresentationContext=\"YES\" id=\"4TF-hz-OQ8\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"C2p-rQ-yHt\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"3L2-TG-g4W\" kind=\"relationship\" relationship=\"rootViewController\" id=\"Vmg-GM-BPP\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Md2-ea-rsV\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"865\" y=\"-557\"/>\n        </scene>\n        <!--Settings View Controller - Settings-->\n        <scene sceneID=\"Q05-Ja-hNK\">\n            <objects>\n                <tableViewController id=\"3L2-TG-g4W\" customClass=\"SettingsViewController\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" opaque=\"NO\" clipsSubviews=\"YES\" clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"pRK-4t-se4\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"cell\" textLabel=\"sPi-6n-HgQ\" style=\"IBUITableViewCellStyleDefault\" id=\"xmg-AA-Ume\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"86\" width=\"320\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"xmg-AA-Ume\" id=\"cEf-2q-fH4\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"43\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Title\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"sPi-6n-HgQ\">\n                                            <rect key=\"frame\" x=\"15\" y=\"0.0\" width=\"290\" height=\"43\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                            <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"3L2-TG-g4W\" id=\"g9F-M3-39Z\"/>\n                            <outlet property=\"delegate\" destination=\"3L2-TG-g4W\" id=\"24N-Q1-3ZK\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Settings\" id=\"rex-sy-t4i\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Done\" id=\"FmW-d9-xoB\">\n                            <connections>\n                                <action selector=\"doneButtonPressed:\" destination=\"3L2-TG-g4W\" id=\"2A1-I4-46a\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"GPi-bE-k3x\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1333\" y=\"-557\"/>\n        </scene>\n    </scenes>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\" type=\"retina4\"/>\n    </simulatedMetricsContainer>\n    <inferredMetricsTieBreakers>\n        <segue reference=\"d91-WC-R0R\"/>\n    </inferredMetricsTieBreakers>\n</document>"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/NavigationController.h",
    "content": "//\n//  NavigationControllerViewController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface NavigationController : UINavigationController\n\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/NavigationController.m",
    "content": "//\n//  MyNavigationControllerViewController.m\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 09/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"NavigationController.h\"\n#import \"AppDelegate.h\"\n#import \"CEBaseInteractionController.h\"\n#import \"CEReversibleAnimationController.h\"\n\n@interface NavigationController () <UINavigationControllerDelegate>\n\n@end\n\n@implementation NavigationController\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        self.delegate = self;\n    }\n    return self;\n}\n\n- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {\n    \n    [self wirePopInteractionControllerTo:viewController];\n}\n\n- (void)wirePopInteractionControllerTo:(UIViewController *)viewController\n{\n    // when a push occurs, wire the interaction controller to the to- view controller\n    if (!AppDelegateAccessor.navigationControllerInteractionController) {\n        return;\n    }\n    \n    [AppDelegateAccessor.navigationControllerInteractionController wireToViewController:viewController forOperation:CEInteractionOperationPop];\n}\n\n\n- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {\n    \n    if (AppDelegateAccessor.navigationControllerAnimationController) {\n        AppDelegateAccessor.navigationControllerAnimationController.reverse = operation == UINavigationControllerOperationPop;\n    }\n    \n    return AppDelegateAccessor.navigationControllerAnimationController;\n}\n\n- (id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController {\n    \n    // if we have an interaction controller - and it is currently in progress, return it\n    return AppDelegateAccessor.navigationControllerInteractionController && AppDelegateAccessor.navigationControllerInteractionController.interactionInProgress ? AppDelegateAccessor.navigationControllerInteractionController : nil;\n}\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/SettingsViewController.h",
    "content": "//\n//  SettingsViewController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface SettingsViewController : UITableViewController\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/SettingsViewController.m",
    "content": "//\n//  SettingsViewController.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"SettingsViewController.h\"\n#import \"NavigationController.h\"\n#import \"CEBaseInteractionController.h\"\n#import \"AppDelegate.h\"\n#import \"CEReversibleAnimationController.h\"\n\n@interface SettingsViewController () <UIViewControllerTransitioningDelegate>\n\n@end\n\n@implementation SettingsViewController {\n    NSArray *_animationControllers;\n    NSArray *_interactionControllers;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        _animationControllers = @[@\"None\", @\"Portal\", @\"Cards\", @\"Fold\", @\"Explode\", @\"Flip\", @\"Turn\", @\"Crossfade\", @\"NatGeo\", @\"Cube\",@\"Pan\"];\n        _interactionControllers = @[@\"None\", @\"HorizontalSwipe\" ,@\"VerticalSwipe\", @\"Pinch\"];\n    }\n    return self;\n}\n\n- (IBAction)doneButtonPressed:(id)sender {\n    [self dismissViewControllerAnimated:YES completion:nil];\n}\n\n- (NSString *)classToTransitionName:(NSObject *)instance {\n    \n    if (!instance)\n        return @\"None\";\n    \n    NSString *animationClass = NSStringFromClass(instance.class);\n    \n    NSMutableString *transitionName = [[NSMutableString alloc] initWithString:animationClass];\n    [transitionName replaceOccurrencesOfString:@\"CE\" withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, transitionName.length)];\n    [transitionName replaceOccurrencesOfString:@\"AnimationController\" withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, transitionName.length)];\n    [transitionName replaceOccurrencesOfString:@\"InteractionController\" withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, transitionName.length)];\n\n    return transitionName;\n}\n\n- (id)transitionNameToInstance:(NSString *)transitionName {\n    NSString *className = [NSString stringWithFormat:@\"CE%@AnimationController\", transitionName];\n    return [[NSClassFromString(className) alloc] init];\n}\n\n#pragma mark - UITableViewDelegate methods\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\n    if (indexPath.section < 2) {\n        // an animation controller was selected\n        NSString* transitionName = _animationControllers[indexPath.row];\n        NSString *className = [NSString stringWithFormat:@\"CE%@AnimationController\", transitionName];\n        id transitionInstance = [[NSClassFromString(className) alloc] init];\n       \n        if (indexPath.section == 0) {\n            AppDelegateAccessor.navigationControllerAnimationController = transitionInstance;\n        }\n        if (indexPath.section == 1) {\n            AppDelegateAccessor.settingsAnimationController = transitionInstance;\n        }\n    } else {\n        // an interaction cntroller was selected\n        NSString* transitionName = _interactionControllers[indexPath.row];\n        NSString *className = [NSString stringWithFormat:@\"CE%@InteractionController\", transitionName];\n        id transitionInstance = [[NSClassFromString(className) alloc] init];\n        \n        if (indexPath.section == 2) {\n            AppDelegateAccessor.navigationControllerInteractionController = transitionInstance;\n        }\n        if (indexPath.section == 3) {\n            AppDelegateAccessor.settingsInteractionController = transitionInstance;\n        }\n    }\n    [self.tableView reloadData];\n}\n\n- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {\n\n    // get the cell text\n    NSString *transitionName = cell.textLabel.text;\n    NSObject *currentTransition;\n    \n    // get the current animation / interaction controller\n    if (indexPath.section < 2) {\n        currentTransition = indexPath.section == 0 ?\n            AppDelegateAccessor.navigationControllerAnimationController :\n            AppDelegateAccessor.settingsAnimationController;\n    } else {\n        currentTransition = indexPath.section == 2 ?\n            AppDelegateAccessor.navigationControllerInteractionController :\n            AppDelegateAccessor.settingsInteractionController;\n    }\n    \n    // if they match - render a tick\n    NSString *transitionClassName = [self classToTransitionName:currentTransition];\n    cell.accessoryType = [transitionName isEqualToString:transitionClassName] ?   UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;\n   \n}\n\n#pragma mark - UITableViewDatasource methods\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"cell\"];\n    \n    if (indexPath.section < 2) {\n        cell.textLabel.text = _animationControllers[indexPath.row];\n    } else {\n        cell.textLabel.text = _interactionControllers[indexPath.row];\n    }\n    return cell;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\n    return section < 2 ? _animationControllers.count : _interactionControllers.count;\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {\n    return 4;\n}\n\n- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {\n    if (section == 0)\n        return @\"Navigation push / pop animation controller\";\n\n    if (section == 1)\n        return @\"Settings present / dismiss animation controller\";\n    \n    if (section == 2)\n        return @\"Navigation push / pop interaction controller\";\n    \n    if (section == 3)\n        return @\"Settings present / dismiss interaction controller\";\n\n    return @\"\";\n}\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/TransitionsDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.scottlogic.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>Launch Screen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main_iPhone</string>\n\t<key>UIMainStoryboardFile~ipad</key>\n\t<string>Main_iPhone</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/TransitionsDemo-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_5_0\n#warning \"This project uses features only available in iOS SDK 5.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    #import <UIKit/UIKit.h>\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/ViewController.h",
    "content": "//\n//  ViewController.h\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"CEReversibleAnimationController.h\"\n\n@interface ViewController : UIViewController\n\n@property (nonatomic, strong) CEReversibleAnimationController *settingsAnimationController;\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/ViewController.m",
    "content": "//\n//  ViewController.m\n//  ViewControllerTransitions\n//\n//  Created by Colin Eberhardt on 08/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import \"ViewController.h\"\n#import \"AppDelegate.h\"\n#import \"CEBaseInteractionController.h\"\n\n@interface ViewController () <UIViewControllerTransitioningDelegate>\n\n@end\n\nstatic int colorIndex = 0;\n\n@implementation ViewController {\n    NSArray* _colors;\n}\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    \n    \n    _colors = @[[UIColor redColor],\n                [UIColor orangeColor],\n                [UIColor yellowColor],\n                [UIColor greenColor],\n                [UIColor blueColor],\n                [UIColor purpleColor]];\n\t\n    self.view.backgroundColor = _colors[colorIndex];\n    \n    colorIndex  = (colorIndex + 1) % _colors.count;\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {\n    \n    if ([segue.identifier isEqualToString:@\"ShowSettings\"]) {\n        UIViewController *toVC = segue.destinationViewController;\n        toVC.transitioningDelegate = self;\n    }\n    \n    [super prepareForSegue:segue sender:sender];\n}\n\n#pragma mark - UIViewControllerTransitioningDelegate\n\n- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {\n    \n    if (AppDelegateAccessor.settingsInteractionController) {\n        [AppDelegateAccessor.settingsInteractionController wireToViewController:presented forOperation:CEInteractionOperationDismiss];\n    }\n    \n    AppDelegateAccessor.settingsAnimationController.reverse = NO;\n    return AppDelegateAccessor.settingsAnimationController;\n}\n\n- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {\n    AppDelegateAccessor.settingsAnimationController.reverse = YES;\n    return AppDelegateAccessor.settingsAnimationController;\n }\n\n - (id<UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id<UIViewControllerAnimatedTransitioning>)animator {\n     return AppDelegateAccessor.settingsInteractionController && AppDelegateAccessor.settingsInteractionController.interactionInProgress ? AppDelegateAccessor.settingsInteractionController : nil;\n }\n\n\n@end\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo/main.m",
    "content": "//\n//  main.m\n//  TransitionsDemo\n//\n//  Created by Colin Eberhardt on 10/09/2013.\n//  Copyright (c) 2013 Colin Eberhardt. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[])\n{\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t3CD5090B189FFE6900BAE35A /* CECubeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CD50909189FFE6900BAE35A /* CECubeAnimationController.m */; };\n\t\t7273232017DFBD4D0072C7FD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7273231F17DFBD4D0072C7FD /* Foundation.framework */; };\n\t\t7273232217DFBD4D0072C7FD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7273232117DFBD4D0072C7FD /* CoreGraphics.framework */; };\n\t\t7273232417DFBD4D0072C7FD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7273232317DFBD4D0072C7FD /* UIKit.framework */; };\n\t\t7273232A17DFBD4D0072C7FD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7273232817DFBD4D0072C7FD /* InfoPlist.strings */; };\n\t\t7273232C17DFBD4D0072C7FD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273232B17DFBD4D0072C7FD /* main.m */; };\n\t\t7273233017DFBD4D0072C7FD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273232F17DFBD4D0072C7FD /* AppDelegate.m */; };\n\t\t7273233317DFBD4D0072C7FD /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7273233117DFBD4D0072C7FD /* Main_iPhone.storyboard */; };\n\t\t7273233917DFBD4D0072C7FD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273233817DFBD4D0072C7FD /* ViewController.m */; };\n\t\t7273233B17DFBD4D0072C7FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7273233A17DFBD4D0072C7FD /* Images.xcassets */; };\n\t\t7273235F17DFBEBF0072C7FD /* CEFlipAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273235B17DFBEBF0072C7FD /* CEFlipAnimationController.m */; };\n\t\t7273236017DFBEBF0072C7FD /* CETurnAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */; };\n\t\t7273236317DFBEFE0072C7FD /* CEReversibleAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */; };\n\t\t7273236917DFBF140072C7FD /* CEBaseInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236617DFBF140072C7FD /* CEBaseInteractionController.m */; };\n\t\t7273236A17DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */; };\n\t\t7273236D17DFC0690072C7FD /* NavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236C17DFC0690072C7FD /* NavigationController.m */; };\n\t\t7273237017DFC4710072C7FD /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236F17DFC4710072C7FD /* SettingsViewController.m */; };\n\t\t72B92C661856FE98001A2D84 /* CEPortalAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72B92C651856FE98001A2D84 /* CEPortalAnimationController.m */; };\n\t\t72C15E1117E10C620056B3F9 /* CECrossfadeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */; };\n\t\t72C15E1417E10E7B0056B3F9 /* CEExplodeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */; };\n\t\t72C15E1717E19A940056B3F9 /* CEFoldAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */; };\n\t\t72EC05A917E7B1BE00DCB9A3 /* CEPinchInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */; };\n\t\t72EE96D817EF47A60097DF82 /* CECardsAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */; };\n\t\t72EE96DB17EF66040097DF82 /* CEVerticalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */; };\n\t\t7D0D046C1816DBA700F289A6 /* CENatGeoAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0D046B1816DBA700F289A6 /* CENatGeoAnimationController.m */; };\n\t\tA993F2801B80832400553FBD /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A993F27E1B80832400553FBD /* Launch Screen.storyboard */; };\n\t\tBC46683B198B2E6700A07DF8 /* CEPanAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC46683A198B2E6700A07DF8 /* CEPanAnimationController.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t3CD50909189FFE6900BAE35A /* CECubeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECubeAnimationController.m; sourceTree = \"<group>\"; };\n\t\t3CD5090A189FFE6900BAE35A /* CECubeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECubeAnimationController.h; sourceTree = \"<group>\"; };\n\t\t7273231C17DFBD4D0072C7FD /* TransitionsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransitionsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7273231F17DFBD4D0072C7FD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t7273232117DFBD4D0072C7FD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t7273232317DFBD4D0072C7FD /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t7273232717DFBD4D0072C7FD /* TransitionsDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"TransitionsDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t7273232917DFBD4D0072C7FD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t7273232B17DFBD4D0072C7FD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t7273232D17DFBD4D0072C7FD /* TransitionsDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"TransitionsDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t7273232E17DFBD4D0072C7FD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t7273232F17DFBD4D0072C7FD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t7273233217DFBD4D0072C7FD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = \"<group>\"; };\n\t\t7273233717DFBD4D0072C7FD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = \"<group>\"; };\n\t\t7273233817DFBD4D0072C7FD /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = \"<group>\"; };\n\t\t7273233A17DFBD4D0072C7FD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t7273234117DFBD4D0072C7FD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\t7273235A17DFBEBF0072C7FD /* CEFlipAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEFlipAnimationController.h; sourceTree = \"<group>\"; };\n\t\t7273235B17DFBEBF0072C7FD /* CEFlipAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEFlipAnimationController.m; sourceTree = \"<group>\"; };\n\t\t7273235C17DFBEBF0072C7FD /* CETurnAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CETurnAnimationController.h; sourceTree = \"<group>\"; };\n\t\t7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CETurnAnimationController.m; sourceTree = \"<group>\"; };\n\t\t7273236117DFBEFE0072C7FD /* CEReversibleAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEReversibleAnimationController.h; sourceTree = \"<group>\"; };\n\t\t7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEReversibleAnimationController.m; sourceTree = \"<group>\"; };\n\t\t7273236517DFBF140072C7FD /* CEBaseInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEBaseInteractionController.h; sourceTree = \"<group>\"; };\n\t\t7273236617DFBF140072C7FD /* CEBaseInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEBaseInteractionController.m; sourceTree = \"<group>\"; };\n\t\t7273236717DFBF140072C7FD /* CEHorizontalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEHorizontalSwipeInteractionController.h; sourceTree = \"<group>\"; };\n\t\t7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEHorizontalSwipeInteractionController.m; sourceTree = \"<group>\"; };\n\t\t7273236B17DFC0690072C7FD /* NavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigationController.h; sourceTree = \"<group>\"; };\n\t\t7273236C17DFC0690072C7FD /* NavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NavigationController.m; sourceTree = \"<group>\"; };\n\t\t7273236E17DFC4710072C7FD /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = \"<group>\"; };\n\t\t7273236F17DFC4710072C7FD /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = \"<group>\"; };\n\t\t72B92C641856FE98001A2D84 /* CEPortalAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEPortalAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72B92C651856FE98001A2D84 /* CEPortalAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPortalAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72C15E0F17E10C620056B3F9 /* CECrossfadeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECrossfadeAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECrossfadeAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72C15E1217E10E7B0056B3F9 /* CEExplodeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEExplodeAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEExplodeAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72C15E1517E19A940056B3F9 /* CEFoldAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEFoldAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEFoldAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EC05A717E7B1BE00DCB9A3 /* CEPinchInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEPinchInteractionController.h; sourceTree = \"<group>\"; };\n\t\t72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPinchInteractionController.m; sourceTree = \"<group>\"; };\n\t\t72EE96D617EF47A60097DF82 /* CECardsAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECardsAnimationController.h; sourceTree = \"<group>\"; };\n\t\t72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECardsAnimationController.m; sourceTree = \"<group>\"; };\n\t\t72EE96D917EF66040097DF82 /* CEVerticalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEVerticalSwipeInteractionController.h; sourceTree = \"<group>\"; };\n\t\t72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEVerticalSwipeInteractionController.m; sourceTree = \"<group>\"; };\n\t\t7D0D046A1816DBA700F289A6 /* CENatGeoAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CENatGeoAnimationController.h; sourceTree = \"<group>\"; };\n\t\t7D0D046B1816DBA700F289A6 /* CENatGeoAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CENatGeoAnimationController.m; sourceTree = \"<group>\"; };\n\t\tA993F27F1B80832400553FBD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = \"Base.lproj/Launch Screen.storyboard\"; sourceTree = \"<group>\"; };\n\t\tBC466839198B2E6700A07DF8 /* CEPanAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEPanAnimationController.h; sourceTree = \"<group>\"; };\n\t\tBC46683A198B2E6700A07DF8 /* CEPanAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPanAnimationController.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7273231917DFBD4D0072C7FD /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7273232217DFBD4D0072C7FD /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t7273232417DFBD4D0072C7FD /* UIKit.framework in Frameworks */,\n\t\t\t\t7273232017DFBD4D0072C7FD /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7273231317DFBD4D0072C7FD = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7273236417DFBF140072C7FD /* InteractionControllers */,\n\t\t\t\t7273235717DFBEBF0072C7FD /* AnimationControllers */,\n\t\t\t\t7273232517DFBD4D0072C7FD /* TransitionsDemo */,\n\t\t\t\t7273231E17DFBD4D0072C7FD /* Frameworks */,\n\t\t\t\t7273231D17DFBD4D0072C7FD /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273231D17DFBD4D0072C7FD /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7273231C17DFBD4D0072C7FD /* TransitionsDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273231E17DFBD4D0072C7FD /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7273231F17DFBD4D0072C7FD /* Foundation.framework */,\n\t\t\t\t7273232117DFBD4D0072C7FD /* CoreGraphics.framework */,\n\t\t\t\t7273232317DFBD4D0072C7FD /* UIKit.framework */,\n\t\t\t\t7273234117DFBD4D0072C7FD /* XCTest.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273232517DFBD4D0072C7FD /* TransitionsDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7273232E17DFBD4D0072C7FD /* AppDelegate.h */,\n\t\t\t\t7273232F17DFBD4D0072C7FD /* AppDelegate.m */,\n\t\t\t\tA993F27E1B80832400553FBD /* Launch Screen.storyboard */,\n\t\t\t\t7273233117DFBD4D0072C7FD /* Main_iPhone.storyboard */,\n\t\t\t\t7273233717DFBD4D0072C7FD /* ViewController.h */,\n\t\t\t\t7273233817DFBD4D0072C7FD /* ViewController.m */,\n\t\t\t\t7273233A17DFBD4D0072C7FD /* Images.xcassets */,\n\t\t\t\t7273232617DFBD4D0072C7FD /* Supporting Files */,\n\t\t\t\t7273236B17DFC0690072C7FD /* NavigationController.h */,\n\t\t\t\t7273236C17DFC0690072C7FD /* NavigationController.m */,\n\t\t\t\t7273236E17DFC4710072C7FD /* SettingsViewController.h */,\n\t\t\t\t7273236F17DFC4710072C7FD /* SettingsViewController.m */,\n\t\t\t);\n\t\t\tpath = TransitionsDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273232617DFBD4D0072C7FD /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7273232717DFBD4D0072C7FD /* TransitionsDemo-Info.plist */,\n\t\t\t\t7273232817DFBD4D0072C7FD /* InfoPlist.strings */,\n\t\t\t\t7273232B17DFBD4D0072C7FD /* main.m */,\n\t\t\t\t7273232D17DFBD4D0072C7FD /* TransitionsDemo-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273235717DFBEBF0072C7FD /* AnimationControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBC466839198B2E6700A07DF8 /* CEPanAnimationController.h */,\n\t\t\t\tBC46683A198B2E6700A07DF8 /* CEPanAnimationController.m */,\n\t\t\t\t3CD5090A189FFE6900BAE35A /* CECubeAnimationController.h */,\n\t\t\t\t3CD50909189FFE6900BAE35A /* CECubeAnimationController.m */,\n\t\t\t\t72B92C641856FE98001A2D84 /* CEPortalAnimationController.h */,\n\t\t\t\t72B92C651856FE98001A2D84 /* CEPortalAnimationController.m */,\n\t\t\t\t7273236117DFBEFE0072C7FD /* CEReversibleAnimationController.h */,\n\t\t\t\t7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */,\n\t\t\t\t7273235A17DFBEBF0072C7FD /* CEFlipAnimationController.h */,\n\t\t\t\t7273235B17DFBEBF0072C7FD /* CEFlipAnimationController.m */,\n\t\t\t\t7273235C17DFBEBF0072C7FD /* CETurnAnimationController.h */,\n\t\t\t\t7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */,\n\t\t\t\t72C15E0F17E10C620056B3F9 /* CECrossfadeAnimationController.h */,\n\t\t\t\t72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */,\n\t\t\t\t72C15E1217E10E7B0056B3F9 /* CEExplodeAnimationController.h */,\n\t\t\t\t72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */,\n\t\t\t\t72C15E1517E19A940056B3F9 /* CEFoldAnimationController.h */,\n\t\t\t\t72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */,\n\t\t\t\t72EE96D617EF47A60097DF82 /* CECardsAnimationController.h */,\n\t\t\t\t72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */,\n\t\t\t\t7D0D046A1816DBA700F289A6 /* CENatGeoAnimationController.h */,\n\t\t\t\t7D0D046B1816DBA700F289A6 /* CENatGeoAnimationController.m */,\n\t\t\t);\n\t\t\tname = AnimationControllers;\n\t\t\tpath = ../AnimationControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273236417DFBF140072C7FD /* InteractionControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7273236517DFBF140072C7FD /* CEBaseInteractionController.h */,\n\t\t\t\t7273236617DFBF140072C7FD /* CEBaseInteractionController.m */,\n\t\t\t\t7273236717DFBF140072C7FD /* CEHorizontalSwipeInteractionController.h */,\n\t\t\t\t7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */,\n\t\t\t\t72EC05A717E7B1BE00DCB9A3 /* CEPinchInteractionController.h */,\n\t\t\t\t72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */,\n\t\t\t\t72EE96D917EF66040097DF82 /* CEVerticalSwipeInteractionController.h */,\n\t\t\t\t72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */,\n\t\t\t);\n\t\t\tname = InteractionControllers;\n\t\t\tpath = ../InteractionControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7273231B17DFBD4D0072C7FD /* TransitionsDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7273235117DFBD4D0072C7FD /* Build configuration list for PBXNativeTarget \"TransitionsDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7273231817DFBD4D0072C7FD /* Sources */,\n\t\t\t\t7273231917DFBD4D0072C7FD /* Frameworks */,\n\t\t\t\t7273231A17DFBD4D0072C7FD /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TransitionsDemo;\n\t\t\tproductName = TransitionsDemo;\n\t\t\tproductReference = 7273231C17DFBD4D0072C7FD /* TransitionsDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7273231417DFBD4D0072C7FD /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0500;\n\t\t\t\tORGANIZATIONNAME = \"Colin Eberhardt\";\n\t\t\t};\n\t\t\tbuildConfigurationList = 7273231717DFBD4D0072C7FD /* Build configuration list for PBXProject \"TransitionsDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7273231317DFBD4D0072C7FD;\n\t\t\tproductRefGroup = 7273231D17DFBD4D0072C7FD /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7273231B17DFBD4D0072C7FD /* TransitionsDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7273231A17DFBD4D0072C7FD /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7273233B17DFBD4D0072C7FD /* Images.xcassets in Resources */,\n\t\t\t\t7273233317DFBD4D0072C7FD /* Main_iPhone.storyboard in Resources */,\n\t\t\t\tA993F2801B80832400553FBD /* Launch Screen.storyboard in Resources */,\n\t\t\t\t7273232A17DFBD4D0072C7FD /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7273231817DFBD4D0072C7FD /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7273236917DFBF140072C7FD /* CEBaseInteractionController.m in Sources */,\n\t\t\t\t7273233917DFBD4D0072C7FD /* ViewController.m in Sources */,\n\t\t\t\t72B92C661856FE98001A2D84 /* CEPortalAnimationController.m in Sources */,\n\t\t\t\t72C15E1717E19A940056B3F9 /* CEFoldAnimationController.m in Sources */,\n\t\t\t\t72C15E1417E10E7B0056B3F9 /* CEExplodeAnimationController.m in Sources */,\n\t\t\t\t72C15E1117E10C620056B3F9 /* CECrossfadeAnimationController.m in Sources */,\n\t\t\t\t72EC05A917E7B1BE00DCB9A3 /* CEPinchInteractionController.m in Sources */,\n\t\t\t\t7273233017DFBD4D0072C7FD /* AppDelegate.m in Sources */,\n\t\t\t\t7273232C17DFBD4D0072C7FD /* main.m in Sources */,\n\t\t\t\t7273236017DFBEBF0072C7FD /* CETurnAnimationController.m in Sources */,\n\t\t\t\t7273236A17DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m in Sources */,\n\t\t\t\t7D0D046C1816DBA700F289A6 /* CENatGeoAnimationController.m in Sources */,\n\t\t\t\t7273236D17DFC0690072C7FD /* NavigationController.m in Sources */,\n\t\t\t\t7273237017DFC4710072C7FD /* SettingsViewController.m in Sources */,\n\t\t\t\t3CD5090B189FFE6900BAE35A /* CECubeAnimationController.m in Sources */,\n\t\t\t\t72EE96DB17EF66040097DF82 /* CEVerticalSwipeInteractionController.m in Sources */,\n\t\t\t\t7273235F17DFBEBF0072C7FD /* CEFlipAnimationController.m in Sources */,\n\t\t\t\t7273236317DFBEFE0072C7FD /* CEReversibleAnimationController.m in Sources */,\n\t\t\t\t72EE96D817EF47A60097DF82 /* CECardsAnimationController.m in Sources */,\n\t\t\t\tBC46683B198B2E6700A07DF8 /* CEPanAnimationController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t7273232817DFBD4D0072C7FD /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t7273232917DFBD4D0072C7FD /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7273233117DFBD4D0072C7FD /* Main_iPhone.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t7273233217DFBD4D0072C7FD /* Base */,\n\t\t\t);\n\t\t\tname = Main_iPhone.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA993F27E1B80832400553FBD /* Launch Screen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tA993F27F1B80832400553FBD /* Base */,\n\t\t\t);\n\t\t\tname = \"Launch Screen.storyboard\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7273234F17DFBD4D0072C7FD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7273235017DFBD4D0072C7FD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7273235217DFBD4D0072C7FD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"TransitionsDemo/TransitionsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"TransitionsDemo/TransitionsDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7273235317DFBD4D0072C7FD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"TransitionsDemo/TransitionsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"TransitionsDemo/TransitionsDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7273231717DFBD4D0072C7FD /* Build configuration list for PBXProject \"TransitionsDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7273234F17DFBD4D0072C7FD /* Debug */,\n\t\t\t\t7273235017DFBD4D0072C7FD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7273235117DFBD4D0072C7FD /* Build configuration list for PBXNativeTarget \"TransitionsDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7273235217DFBD4D0072C7FD /* Debug */,\n\t\t\t\t7273235317DFBD4D0072C7FD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7273231417DFBD4D0072C7FD /* Project object */;\n}\n"
  },
  {
    "path": "TransitionsDemo/TransitionsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:TransitionsDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "VCTransitionsLibrary.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name         = 'VCTransitionsLibrary'\n  s.version      = '1.5.0'\n  s.summary      = 'A collection of interactive iOS 7 custom transitions, including flip, fold, cross-fade and more'\n  s.author = {\n    'Colin Eberhardt' => 'colin.eberhardt@gmail.com'\n  }\n  s.source = {\n    :git => 'https://github.com/ColinEberhardt/VCTransitionsLibrary.git',\n    :tag => '1.5.0'\n  }\n  s.license      = {\n    :type => 'MIT',\n    :file => 'MIT-LICENSE.txt'\n  }\n  s.source_files = 'AnimationControllers/*.{h,m}', 'InteractionControllers/*.{h,m}' \n  s.homepage = 'https://github.com/ColinEberhardt/VCTransitionsLibrary'\n  s.requires_arc = true\nend\n"
  }
]