Repository: ColinEberhardt/VCTransitionsLibrary Branch: master Commit: 4ce0512ffac8 Files: 73 Total size: 204.1 KB Directory structure: gitextract_s4rkdg0k/ ├── .gitignore ├── AnimationControllers/ │ ├── CECardsAnimationController.h │ ├── CECardsAnimationController.m │ ├── CECrossfadeAnimationController.h │ ├── CECrossfadeAnimationController.m │ ├── CECubeAnimationController.h │ ├── CECubeAnimationController.m │ ├── CEExplodeAnimationController.h │ ├── CEExplodeAnimationController.m │ ├── CEFlipAnimationController.h │ ├── CEFlipAnimationController.m │ ├── CEFoldAnimationController.h │ ├── CEFoldAnimationController.m │ ├── CENatGeoAnimationController.h │ ├── CENatGeoAnimationController.m │ ├── CEPanAnimationController.h │ ├── CEPanAnimationController.m │ ├── CEPortalAnimationController.h │ ├── CEPortalAnimationController.m │ ├── CEReversibleAnimationController.h │ ├── CEReversibleAnimationController.m │ ├── CETurnAnimationController.h │ └── CETurnAnimationController.m ├── CHANGELOG.md ├── InteractionControllers/ │ ├── CEBaseInteractionController.h │ ├── CEBaseInteractionController.m │ ├── CEHorizontalSwipeInteractionController.h │ ├── CEHorizontalSwipeInteractionController.m │ ├── CEPinchInteractionController.h │ ├── CEPinchInteractionController.m │ ├── CEVerticalSwipeInteractionController.h │ └── CEVerticalSwipeInteractionController.m ├── MIT-LICENSE.txt ├── README.md ├── TabBarDemo/ │ ├── TabBarDemo/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Base.lproj/ │ │ │ ├── Main_iPad.storyboard │ │ │ └── Main_iPhone.storyboard │ │ ├── Images.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── LaunchImage.launchimage/ │ │ │ └── Contents.json │ │ ├── TabBarDemo-Info.plist │ │ ├── TabBarDemo-Prefix.pch │ │ ├── TabBarViewController.h │ │ ├── TabBarViewController.m │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ ├── en.lproj/ │ │ │ └── InfoPlist.strings │ │ └── main.m │ ├── TabBarDemo.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── TabBarDemo.xccheckout │ └── TabBarDemoTests/ │ ├── TabBarDemoTests-Info.plist │ ├── TabBarDemoTests.m │ └── en.lproj/ │ └── InfoPlist.strings ├── TransitionsDemo/ │ ├── TransitionsDemo/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Base.lproj/ │ │ │ ├── Launch Screen.storyboard │ │ │ └── Main_iPhone.storyboard │ │ ├── Images.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── LaunchImage.launchimage/ │ │ │ └── Contents.json │ │ ├── NavigationController.h │ │ ├── NavigationController.m │ │ ├── SettingsViewController.h │ │ ├── SettingsViewController.m │ │ ├── TransitionsDemo-Info.plist │ │ ├── TransitionsDemo-Prefix.pch │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ ├── en.lproj/ │ │ │ └── InfoPlist.strings │ │ └── main.m │ └── TransitionsDemo.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ └── contents.xcworkspacedata └── VCTransitionsLibrary.podspec ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ ######################### # .gitignore file for Xcode4 / OS X Source projects # # Version 2.0 # For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects # # 2013 updates: # - fixed the broken "save personal Schemes" # # NB: if you are storing "built" products, this WILL NOT WORK, # and you should use a different .gitignore (or none at all) # This file is for SOURCE projects, where there are many extra # files that we want to exclude # ######################### ##### # OS X temporary files that should never be committed .DS_Store *.swp *.lock profile #### # Xcode temporary files that should never be committed # # NB: NIB/XIB files still exist even on Storyboard projects, so we want this... *~.nib #### # Xcode build files - # # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" DerivedData/ # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" build/ ##### # Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) # # This is complicated: # # SOMETIMES you need to put this file in version control. # Apple designed it poorly - if you use "custom executables", they are # saved in this file. # 99% of projects do NOT use those, so they do NOT want to version control this file. # ..but if you're in the 1%, comment out the line "*.pbxuser" *.pbxuser *.mode1v3 *.mode2v3 *.perspectivev3 # NB: also, whitelist the default ones, some projects need to use these !default.pbxuser !default.mode1v3 !default.mode2v3 !default.perspectivev3 #### # Xcode 4 - semi-personal settings # # # OPTION 1: --------------------------------- # throw away ALL personal settings (including custom schemes! # - unless they are "shared") # # NB: this is exclusive with OPTION 2 below xcuserdata # OPTION 2: --------------------------------- # get rid of ALL personal settings, but KEEP SOME OF THEM # - NB: you must manually uncomment the bits you want to keep # # NB: this is exclusive with OPTION 1 above # #xcuserdata/**/* # (requires option 2 above): Personal Schemes # #!xcuserdata/**/xcschemes/* #### # XCode 4 workspaces - more detailed # # Workspaces are important! They are a core feature of Xcode - don't exclude them :) # # Workspace layout is quite spammy. For reference: # # /(root)/ # /(project-name).xcodeproj/ # project.pbxproj # /project.xcworkspace/ # contents.xcworkspacedata # /xcuserdata/ # /(your name)/xcuserdatad/ # UserInterfaceState.xcuserstate # /xcsshareddata/ # /xcschemes/ # (shared scheme name).xcscheme # /xcuserdata/ # /(your name)/xcuserdatad/ # (private scheme).xcscheme # xcschememanagement.plist # # #### # Xcode 4 - Deprecated classes # # Allegedly, if you manually "deprecate" your classes, they get moved here. # # We're using source-control, so this is a "feature" that we do not want! *.moved-aside #### # Cocoapods: cocoapods.org # # Ignoring these files means that whoever uses the code will first have to run: # pod install # in the App.xcodeproj directory. # This ensures the latest dependencies are used. Pods/ Podfile.lock #### # UNKNOWN: recommended by others, but I can't discover what these files are # # ...none. Everything is now explained. TransitionsDemo.xccheckout ================================================ FILE: AnimationControllers/CECardsAnimationController.h ================================================ // // CEZoomAnimationController.h // TransitionsDemo // // Created by Colin Eberhardt on 22/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEReversibleAnimationController.h" @interface CECardsAnimationController : CEReversibleAnimationController @end ================================================ FILE: AnimationControllers/CECardsAnimationController.m ================================================ // // CEZoomAnimationController.m // TransitionsDemo // // Created by Colin Eberhardt on 22/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CECardsAnimationController.h" @implementation CECardsAnimationController - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { if(self.reverse){ [self executeReverseAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView]; } else { [self executeForwardsAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView]; } } -(void)executeForwardsAnimation:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { UIView* containerView = [transitionContext containerView]; // positions the to- view off the bottom of the sceen CGRect frame = [transitionContext initialFrameForViewController:fromVC]; CGRect offScreenFrame = frame; offScreenFrame.origin.y = offScreenFrame.size.height; toView.frame = offScreenFrame; [containerView insertSubview:toView aboveSubview:fromView]; CATransform3D t1 = [self firstTransform]; CATransform3D t2 = [self secondTransformWithView:fromView]; [UIView animateKeyframesWithDuration:self.duration delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{ // push the from- view to the back [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:0.4f animations:^{ fromView.layer.transform = t1; fromView.alpha = 0.6; }]; [UIView addKeyframeWithRelativeStartTime:0.2f relativeDuration:0.4f animations:^{ fromView.layer.transform = t2; }]; // slide the to- view upwards. In his original implementation Tope used a 'spring' animation, however // this does not work with keyframes, so we siulate it by overshooting the final location in // the first keyframe [UIView addKeyframeWithRelativeStartTime:0.6f relativeDuration:0.2f animations:^{ toView.frame = CGRectOffset(toView.frame, 0.0, -30.0); }]; [UIView addKeyframeWithRelativeStartTime:0.8f relativeDuration:0.2f animations:^{ toView.frame = frame; }]; } completion:^(BOOL finished) { [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } -(void)executeReverseAnimation:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { UIView* containerView = [transitionContext containerView]; // positions the to- view behind the from- view CGRect frame = [transitionContext initialFrameForViewController:fromVC]; toView.frame = frame; CATransform3D scale = CATransform3DIdentity; toView.layer.transform = CATransform3DScale(scale, 0.6, 0.6, 1); toView.alpha = 0.6; [containerView insertSubview:toView belowSubview:fromView]; CGRect frameOffScreen = frame; frameOffScreen.origin.y = frame.size.height; CATransform3D t1 = [self firstTransform]; [UIView animateKeyframesWithDuration:self.duration delay:0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{ // push the from- view off the bottom of the screen [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:0.5f animations:^{ fromView.frame = frameOffScreen; }]; // animate the to- view into place [UIView addKeyframeWithRelativeStartTime:0.35f relativeDuration:0.35f animations:^{ toView.layer.transform = t1; toView.alpha = 1.0; }]; [UIView addKeyframeWithRelativeStartTime:0.75f relativeDuration:0.25f animations:^{ toView.layer.transform = CATransform3DIdentity; }]; } completion:^(BOOL finished) { if ([transitionContext transitionWasCancelled]) { toView.layer.transform = CATransform3DIdentity; toView.alpha = 1.0; } [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } -(CATransform3D)firstTransform{ CATransform3D t1 = CATransform3DIdentity; t1.m34 = 1.0/-900; t1 = CATransform3DScale(t1, 0.95, 0.95, 1); t1 = CATransform3DRotate(t1, 15.0f * M_PI/180.0f, 1, 0, 0); return t1; } -(CATransform3D)secondTransformWithView:(UIView*)view{ CATransform3D t2 = CATransform3DIdentity; t2.m34 = [self firstTransform].m34; t2 = CATransform3DTranslate(t2, 0, view.frame.size.height*-0.08, 0); t2 = CATransform3DScale(t2, 0.8, 0.8, 1); return t2; } @end ================================================ FILE: AnimationControllers/CECrossfadeAnimationController.h ================================================ // // CECrossfadeAnimationController.h // TransitionsDemo // // Created by Colin Eberhardt on 11/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEReversibleAnimationController.h" /** Animates between the two view controllers by performing a simple cross-fade. */ @interface CECrossfadeAnimationController : CEReversibleAnimationController @end ================================================ FILE: AnimationControllers/CECrossfadeAnimationController.m ================================================ // // CECrossfadeAnimationController.m // TransitionsDemo // // Created by Colin Eberhardt on 11/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CECrossfadeAnimationController.h" @implementation CECrossfadeAnimationController - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { // Add the toView to the container UIView* containerView = [transitionContext containerView]; toView.frame = [transitionContext finalFrameForViewController:toVC]; [containerView addSubview:toView]; [containerView sendSubviewToBack:toView]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration animations:^{ fromView.alpha = 0.0; } completion:^(BOOL finished) { if ([transitionContext transitionWasCancelled]) { fromView.alpha = 1.0; } else { // reset from- view to its original state [fromView removeFromSuperview]; fromView.alpha = 1.0; } [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } @end ================================================ FILE: AnimationControllers/CECubeAnimationController.h ================================================ // // CubeNavigationAnimator.h // MovieQuiz // // Created by Andrés Brun on 27/10/13. // Copyright (c) 2013 Andrés Brun. All rights reserved. // #import #import "CEReversibleAnimationController.h" typedef enum {CubeAnimationWayHorizontal, CubeAnimationWayVertical} CubeAnimationWay; typedef enum {CubeAnimationTypeInverse, CubeAnimationTypeNormal} CubeAnimationType; @interface CECubeAnimationController : CEReversibleAnimationController @property (nonatomic, assign) CubeAnimationWay cubeAnimationWay; @property (nonatomic, assign) CubeAnimationType cubeAnimationType; @end ================================================ FILE: AnimationControllers/CECubeAnimationController.m ================================================ // // CubeNavigationAnimator.m // MovieQuiz // // Created by Andrés Brun on 27/10/13. // Copyright (c) 2013 Andrés Brun. All rights reserved. // #import "CECubeAnimationController.h" #define PERSPECTIVE -1.0 / 200.0 #define ROTATION_ANGLE M_PI_2 @implementation CECubeAnimationController - (id)init { self = [super init]; if (self) { self.cubeAnimationWay = CubeAnimationWayHorizontal; } return self; } - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { toView.frame = [transitionContext finalFrameForViewController:toVC]; //Calculate the direction int dir = self.reverse ? 1 : -1; //Create the differents 3D animations CATransform3D viewFromTransform; CATransform3D viewToTransform; //We create a content view for do the translate animation UIView *generalContentView = [transitionContext containerView]; switch (self.cubeAnimationWay) { case CubeAnimationWayHorizontal: viewFromTransform = CATransform3DMakeRotation(dir*ROTATION_ANGLE, 0.0, 1.0, 0.0); viewToTransform = CATransform3DMakeRotation(-dir*ROTATION_ANGLE, 0.0, 1.0, 0.0); [toView.layer setAnchorPoint:CGPointMake(dir==1?0:1, 0.5)]; [fromView.layer setAnchorPoint:CGPointMake(dir==1?1:0, 0.5)]; [generalContentView setTransform:CGAffineTransformMakeTranslation(dir*(generalContentView.frame.size.width)/2.0, 0)]; break; case CubeAnimationWayVertical: viewFromTransform = CATransform3DMakeRotation(-dir*ROTATION_ANGLE, 1.0, 0.0, 0.0); viewToTransform = CATransform3DMakeRotation(dir*ROTATION_ANGLE, 1.0, 0.0, 0.0); [toView.layer setAnchorPoint:CGPointMake(0.5, dir==1?0:1)]; [fromView.layer setAnchorPoint:CGPointMake(0.5, dir==1?1:0)]; [generalContentView setTransform:CGAffineTransformMakeTranslation(0, dir*(generalContentView.frame.size.height)/2.0)]; break; default: break; } viewFromTransform.m34 = PERSPECTIVE; viewToTransform.m34 = PERSPECTIVE; toView.layer.transform = viewToTransform; //Create the shadow UIView *fromShadow = [self addOpacityToView:fromView withColor:[UIColor blackColor]]; UIView *toShadow = [self addOpacityToView:toView withColor:[UIColor blackColor]]; [fromShadow setAlpha:0.0]; [toShadow setAlpha:1.0]; //Add the to- view [generalContentView addSubview:toView]; [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ switch (self.cubeAnimationWay) { case CubeAnimationWayHorizontal: [generalContentView setTransform:CGAffineTransformMakeTranslation(-dir*generalContentView.frame.size.width/2.0, 0)]; break; case CubeAnimationWayVertical: [generalContentView setTransform:CGAffineTransformMakeTranslation(0, -dir*(generalContentView.frame.size.height)/2.0)]; break; default: break; } fromView.layer.transform = viewFromTransform; toView.layer.transform = CATransform3DIdentity; [fromShadow setAlpha:1.0]; [toShadow setAlpha:0.0]; } completion:^(BOOL finished) { //Set the final position of every elements transformed [generalContentView setTransform:CGAffineTransformIdentity]; fromView.layer.transform = CATransform3DIdentity; toView.layer.transform = CATransform3DIdentity; [fromView.layer setAnchorPoint:CGPointMake(0.5f, 0.5f)]; [toView.layer setAnchorPoint:CGPointMake(0.5f, 0.5f)]; [fromShadow removeFromSuperview]; [toShadow removeFromSuperview]; if ([transitionContext transitionWasCancelled]) { [toView removeFromSuperview]; } else { [fromView removeFromSuperview]; } // inform the context of completion [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } - (UIView *)addOpacityToView:(UIView *) view withColor:(UIColor *)theColor { UIView *shadowView = [[UIView alloc] initWithFrame:view.bounds]; [shadowView setBackgroundColor:[theColor colorWithAlphaComponent:0.8]]; [view addSubview:shadowView]; return shadowView; } @end ================================================ FILE: AnimationControllers/CEExplodeAnimationController.h ================================================ // // CEExplodeAnimationController.h // TransitionsDemo // // Created by Colin Eberhardt on 11/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEReversibleAnimationController.h" /** Animates between the two view controllers by slicing the from- view controller into lots of little pieces, then randomly spinning and shrinking them. */ @interface CEExplodeAnimationController : CEReversibleAnimationController @end ================================================ FILE: AnimationControllers/CEExplodeAnimationController.m ================================================ // // CEExplodeAnimationController.m // TransitionsDemo // // Created by Colin Eberhardt on 11/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEExplodeAnimationController.h" @implementation CEExplodeAnimationController - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { // Add the toView to the container UIView* containerView = [transitionContext containerView]; [containerView addSubview:toView]; [containerView sendSubviewToBack:toView]; CGSize size = toView.frame.size; NSMutableArray *snapshots = [NSMutableArray new]; CGFloat xFactor = 10.0f; CGFloat yFactor = xFactor * size.height / size.width; // snapshot the from view, this makes subsequent snaphots more performant UIView *fromViewSnapshot = [fromView snapshotViewAfterScreenUpdates:NO]; // create a snapshot for each of the exploding pieces for (CGFloat x=0; x < size.width; x+= size.width / xFactor) { for (CGFloat y=0; y < size.height; y+= size.height / yFactor) { CGRect snapshotRegion = CGRectMake(x, y, size.width / xFactor, size.height / yFactor); UIView *snapshot = [fromViewSnapshot resizableSnapshotViewFromRect:snapshotRegion afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero]; snapshot.frame = snapshotRegion; [containerView addSubview:snapshot]; [snapshots addObject:snapshot]; } } [containerView sendSubviewToBack:fromView]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration animations:^{ for (UIView *view in snapshots) { CGFloat xOffset = [self randomFloatBetween:-100.0 and:100.0]; CGFloat yOffset = [self randomFloatBetween:-100.0 and:100.0]; view.frame = CGRectOffset(view.frame, xOffset, yOffset); view.alpha = 0.0; view.transform = CGAffineTransformScale(CGAffineTransformMakeRotation([self randomFloatBetween:-10.0 and:10.0]), 0.01, 0.01); } } completion:^(BOOL finished) { for (UIView *view in snapshots) { [view removeFromSuperview]; } [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } - (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber { float diff = bigNumber - smallNumber; return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber; } @end ================================================ FILE: AnimationControllers/CEFlipAnimationController.h ================================================ // // CEFlipAnimationController.h // ViewControllerTransitions // // Created by Colin Eberhardt on 09/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEReversibleAnimationController.h" /** Animates between the two view controllers using a page-flip transition. */ @interface CEFlipAnimationController : CEReversibleAnimationController @end ================================================ FILE: AnimationControllers/CEFlipAnimationController.m ================================================ // // CEFlipAnimationController.m // ViewControllerTransitions // // Created by Colin Eberhardt on 09/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEFlipAnimationController.h" @implementation CEFlipAnimationController - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { // Add the toView to the container UIView* containerView = [transitionContext containerView]; [containerView addSubview:toView]; [containerView sendSubviewToBack:toView]; // Add a perspective transform CATransform3D transform = CATransform3DIdentity; transform.m34 = -0.002; [containerView.layer setSublayerTransform:transform]; // Give both VCs the same start frame CGRect initialFrame = [transitionContext initialFrameForViewController:fromVC]; fromView.frame = initialFrame; toView.frame = initialFrame; // create two-part snapshots of both the from- and to- views NSArray* toViewSnapshots = [self createSnapshots:toView afterScreenUpdates:YES]; UIView* flippedSectionOfToView = toViewSnapshots[self.reverse ? 0 : 1]; NSArray* fromViewSnapshots = [self createSnapshots:fromView afterScreenUpdates:NO]; UIView* flippedSectionOfFromView = fromViewSnapshots[self.reverse ? 1 : 0]; // replace the from- and to- views with container views that include gradients flippedSectionOfFromView = [self addShadowToView:flippedSectionOfFromView reverse:!self.reverse]; UIView* flippedSectionOfFromViewShadow = flippedSectionOfFromView.subviews[1]; flippedSectionOfFromViewShadow.alpha = 0.0; flippedSectionOfToView = [self addShadowToView:flippedSectionOfToView reverse:self.reverse]; UIView* flippedSectionOfToViewShadow = flippedSectionOfToView.subviews[1]; flippedSectionOfToViewShadow.alpha = 1.0; // change the anchor point so that the view rotate around the correct edge [self updateAnchorPointAndOffset:CGPointMake(self.reverse ? 0.0 : 1.0, 0.5) view:flippedSectionOfFromView]; [self updateAnchorPointAndOffset:CGPointMake(self.reverse ? 1.0 : 0.0, 0.5) view:flippedSectionOfToView]; // rotate the to- view by 90 degrees, hiding it flippedSectionOfToView.layer.transform = [self rotate:self.reverse ? M_PI_2 : -M_PI_2]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateKeyframesWithDuration:duration delay:0.0 options:0 animations:^{ [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{ // rotate the from- view to 90 degrees flippedSectionOfFromView.layer.transform = [self rotate:self.reverse ? -M_PI_2 : M_PI_2]; flippedSectionOfFromViewShadow.alpha = 1.0; }]; [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{ // rotate the to- view to 0 degrees flippedSectionOfToView.layer.transform = [self rotate:self.reverse ? 0.001 : -0.001]; flippedSectionOfToViewShadow.alpha = 0.0; }]; } completion:^(BOOL finished) { // remove all the temporary views if ([transitionContext transitionWasCancelled]) { [self removeOtherViews:fromView]; } else { [self removeOtherViews:toView]; } // inform the context of completion [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } // removes all the views other than the given view from the superview - (void)removeOtherViews:(UIView*)viewToKeep { UIView* containerView = viewToKeep.superview; for (UIView* view in containerView.subviews) { if (view != viewToKeep) { [view removeFromSuperview]; } } } // adds a gradient to an image by creating a containing UIView with both the given view // and the gradient as subviews - (UIView*)addShadowToView:(UIView*)view reverse:(BOOL)reverse { UIView* containerView = view.superview; // create a view with the same frame UIView* viewWithShadow = [[UIView alloc] initWithFrame:view.frame]; // replace the view that we are adding a shadow to [containerView insertSubview:viewWithShadow aboveSubview:view]; [view removeFromSuperview]; // create a shadow UIView* shadowView = [[UIView alloc] initWithFrame:viewWithShadow.bounds]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = shadowView.bounds; gradient.colors = @[(id)[UIColor colorWithWhite:0.0 alpha:0.0].CGColor, (id)[UIColor colorWithWhite:0.0 alpha:0.5].CGColor]; gradient.startPoint = CGPointMake(reverse ? 0.0 : 1.0, 0.0); gradient.endPoint = CGPointMake(reverse ? 1.0 : 0.0, 0.0); [shadowView.layer insertSublayer:gradient atIndex:1]; // add the original view into our new view view.frame = view.bounds; [viewWithShadow addSubview:view]; // place the shadow on top [viewWithShadow addSubview:shadowView]; return viewWithShadow; } // creates a pair of snapshots from the given view - (NSArray*)createSnapshots:(UIView*)view afterScreenUpdates:(BOOL) afterUpdates{ UIView* containerView = view.superview; // snapshot the left-hand side of the view CGRect snapshotRegion = CGRectMake(0, 0, view.frame.size.width / 2, view.frame.size.height); UIView *leftHandView = [view resizableSnapshotViewFromRect:snapshotRegion afterScreenUpdates:afterUpdates withCapInsets:UIEdgeInsetsZero]; leftHandView.frame = snapshotRegion; [containerView addSubview:leftHandView]; // snapshot the right-hand side of the view snapshotRegion = CGRectMake(view.frame.size.width / 2, 0, view.frame.size.width / 2, view.frame.size.height); UIView *rightHandView = [view resizableSnapshotViewFromRect:snapshotRegion afterScreenUpdates:afterUpdates withCapInsets:UIEdgeInsetsZero]; rightHandView.frame = snapshotRegion; [containerView addSubview:rightHandView]; // send the view that was snapshotted to the back [containerView sendSubviewToBack:view]; return @[leftHandView, rightHandView]; } // updates the anchor point for the given view, offseting the frame to compensate for the resulting movement - (void)updateAnchorPointAndOffset:(CGPoint)anchorPoint view:(UIView*)view { view.layer.anchorPoint = anchorPoint; float xOffset = anchorPoint.x - 0.5; view.frame = CGRectOffset(view.frame, xOffset * view.frame.size.width, 0); } - (CATransform3D) rotate:(CGFloat) angle { return CATransform3DMakeRotation(angle, 0.0, 1.0, 0.0); } @end ================================================ FILE: AnimationControllers/CEFoldAnimationController.h ================================================ // // CEAccordionAnimationController.h // TransitionsDemo // // Created by Colin Eberhardt on 12/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEReversibleAnimationController.h" /** Animates between the two view controllers using a paper-fold style transition. You can configure the number of folds via the `folds` property. */ @interface CEFoldAnimationController : CEReversibleAnimationController @property (nonatomic) NSUInteger folds; @end ================================================ FILE: AnimationControllers/CEFoldAnimationController.m ================================================ // // CEAccordionAnimationController.m // TransitionsDemo // // Created by Colin Eberhardt on 12/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEFoldAnimationController.h" @implementation CEFoldAnimationController - (id)init { if (self = [super init]) { self.folds = 2; } return self; } - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { // Add the toView to the container UIView* containerView = [transitionContext containerView]; // move offscreen toView.frame = [transitionContext finalFrameForViewController:toVC]; toView.frame = CGRectOffset(toView.frame, toView.frame.size.width, 0); [containerView addSubview:toView]; // Add a perspective transform CATransform3D transform = CATransform3DIdentity; transform.m34 = -0.005; containerView.layer.sublayerTransform = transform; CGSize size = toView.frame.size; float foldWidth = size.width * 0.5 / (float)self.folds ; // arrays that hold the snapshot views NSMutableArray* fromViewFolds = [NSMutableArray new]; NSMutableArray* toViewFolds = [NSMutableArray new]; // create the folds for the form- and to- views for (int i=0 ;i)transitionContext { // Grab the from and to view controllers from the context UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; [transitionContext.containerView addSubview:fromViewController.view]; [transitionContext.containerView addSubview:toViewController.view]; CALayer *fromLayer; CALayer *toLayer; if (self.reverse) { toViewController.view.userInteractionEnabled = YES; fromLayer = toViewController.view.layer; toLayer = fromViewController.view.layer; // Reset to initial transform sourceLastTransform(fromLayer); destinationLastTransform(toLayer); //Perform animation [UIView animateKeyframesWithDuration:self.duration delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{ [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:kAnimationFirstPartRatio animations:^{ sourceFirstTransform(fromLayer); }]; [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:1.0f animations:^{ destinationFirstTransform(toLayer); }]; } completion:^(BOOL finished) { // Bring the from view back to the front and re-disable the user // interaction of the to view since the dismissal has been cancelled if ([transitionContext transitionWasCancelled]) { [transitionContext.containerView bringSubviewToFront:fromViewController.view]; toViewController.view.userInteractionEnabled = NO; } fromViewController.view.layer.transform = CATransform3DIdentity; toViewController.view.layer.transform = CATransform3DIdentity; transitionContext.containerView.layer.transform = CATransform3DIdentity; [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } else { fromViewController.view.userInteractionEnabled = NO; fromLayer = fromViewController.view.layer; toLayer = toViewController.view.layer; // Change anchor point and reposition it. CGRect oldFrame = fromLayer.frame; [fromLayer setAnchorPoint:CGPointMake(0.0f, 0.5f)]; [fromLayer setFrame:oldFrame]; // Reset to initial transform sourceFirstTransform(fromLayer); destinationFirstTransform(toLayer); //Perform animation [UIView animateKeyframesWithDuration:self.duration delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{ [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:1.0f animations:^{ destinationLastTransform(toLayer); }]; [UIView addKeyframeWithRelativeStartTime:(1.0f - kAnimationFirstPartRatio) relativeDuration:kAnimationFirstPartRatio animations:^{ sourceLastTransform(fromLayer); }]; } completion:^(BOOL finished) { // Bring the from view back to the front and re-enable its user // interaction since the presentation has been cancelled if ([transitionContext transitionWasCancelled]) { [transitionContext.containerView bringSubviewToFront:fromViewController.view]; fromViewController.view.userInteractionEnabled = YES; } fromViewController.view.layer.transform = CATransform3DIdentity; toViewController.view.layer.transform = CATransform3DIdentity; transitionContext.containerView.layer.transform = CATransform3DIdentity; [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } } #pragma mark - #pragma mark - Required 3d Transform static void sourceFirstTransform(CALayer *layer) { CATransform3D t = CATransform3DIdentity; t.m34 = 1.0 / -500; t = CATransform3DTranslate(t, 0.0f, 0.0f, 0.0f); layer.transform = t; } static void sourceLastTransform(CALayer *layer) { CATransform3D t = CATransform3DIdentity; t.m34 = 1.0 / -500.0f; t = CATransform3DRotate(t, radianFromDegree(80), 0.0f, 1.0f, 0.0f); t = CATransform3DTranslate(t, 0.0f, 0.0f, -30.0f); t = CATransform3DTranslate(t, 170.0f, 0.0f, 0.0f); layer.transform = t; } static void destinationFirstTransform(CALayer * layer) { CATransform3D t = CATransform3DIdentity; t.m34 = 1.0f / -500.0f; // Rotate 5 degrees within the axis of z axis t = CATransform3DRotate(t, radianFromDegree(5.0f), 0.0f, 0.0f, 1.0f); // Reposition toward to the left where it initialized t = CATransform3DTranslate(t, 320.0f, -40.0f, 150.0f); // Rotate it -45 degrees within the y axis t = CATransform3DRotate(t, radianFromDegree(-45), 0.0f, 1.0f, 0.0f); // Rotate it 10 degrees within thee x axis t = CATransform3DRotate(t, radianFromDegree(10), 1.0f, 0.0f, 0.0f); layer.transform = t; } static void destinationLastTransform(CALayer * layer) { CATransform3D t = CATransform3DIdentity; t.m34 = 1.0/ -500; // Rotate to 0 degrees within z axis t = CATransform3DRotate(t, radianFromDegree(0), 0.0f, 0.0f, 1.0f); // Bring back to the final position t = CATransform3DTranslate(t, 0.0f, 0.0f, 0.0f); // Rotate 0 degrees within y axis t = CATransform3DRotate(t, radianFromDegree(0), 0.0f, 1.0f, 0.0f); // Rotate 0 degrees within x axis t = CATransform3DRotate(t, radianFromDegree(0), 1.0f, 0.0f, 0.0f); layer.transform = t; } #pragma mark - Convert Degrees to Radian static double radianFromDegree(float degrees) { return (degrees / 180) * M_PI; } @end ================================================ FILE: AnimationControllers/CEPanAnimationController.h ================================================ // // CEPanAnimationController.h // TransitionsDemo // // Created by Alvin Zeng on 01/08/2014. // Copyright (c) 2014 Alvin Zeng. All rights reserved. // #import "CEReversibleAnimationController.h" /** Animates between the two view controllers by performing a simple pan. */ @interface CEPanAnimationController : CEReversibleAnimationController @end ================================================ FILE: AnimationControllers/CEPanAnimationController.m ================================================ // // CEPanAnimationController.m // TransitionsDemo // // Created by Alvin Zeng on 01/08/2014. // Copyright (c) 2014 Alvin Zeng. All rights reserved. // #import "CEPanAnimationController.h" @implementation CEPanAnimationController - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { self.duration = .3; // Add the toView to the container UIView* containerView = [transitionContext containerView]; [containerView addSubview:toView]; toView.frame = CGRectMake(self.reverse ? -160 : 320, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height); self.reverse ? [containerView sendSubviewToBack:toView] : [containerView bringSubviewToFront:toView]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration animations:^{ fromView.frame = CGRectMake(!self.reverse ? -160 : 320, fromView.frame.origin.y, fromView.frame.size.width, fromView.frame.size.height); toView.frame = CGRectMake(0, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height); } completion:^(BOOL finished) { if ([transitionContext transitionWasCancelled]) { toView.frame = CGRectMake(0, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height); fromView.frame = CGRectMake(0, fromView.frame.origin.y, fromView.frame.size.width, fromView.frame.size.height); } else { // reset from- view to its original state [fromView removeFromSuperview]; fromView.frame = CGRectMake(!self.reverse ? -160 : 320, fromView.frame.origin.y, fromView.frame.size.width, fromView.frame.size.height); toView.frame = CGRectMake(0, toView.frame.origin.y, toView.frame.size.width, toView.frame.size.height); } [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } @end ================================================ FILE: AnimationControllers/CEPortalAnimationController.h ================================================ // // ZENPortalAnimationController.h // ZEN BabyBook // // Created by Frédéric ADDA on 07/12/2013. // Copyright (c) 2013 Frédéric ADDA. All rights reserved. // #import "CEReversibleAnimationController.h" /* Animates between the two view controllers using a portal-opening transition. */ @interface CEPortalAnimationController : CEReversibleAnimationController @end ================================================ FILE: AnimationControllers/CEPortalAnimationController.m ================================================ // // ZENPortalAnimationController.m // ZEN BabyBook // // Created by Frédéric ADDA on 07/12/2013. // Copyright (c) 2013 Frédéric ADDA. All rights reserved. // #import "CEPortalAnimationController.h" @implementation CEPortalAnimationController - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { if(self.reverse){ [self executeReverseAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView]; } else { [self executeForwardsAnimation:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView]; } } #define ZOOM_SCALE 0.8 - (void)executeForwardsAnimation:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { UIView *containerView = [transitionContext containerView]; // Add a reduced snapshot of the toView to the container UIView *toViewSnapshot = [toView resizableSnapshotViewFromRect:toView.frame afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero]; CATransform3D scale = CATransform3DIdentity; toViewSnapshot.layer.transform = CATransform3DScale(scale, ZOOM_SCALE, ZOOM_SCALE, 1); [containerView addSubview:toViewSnapshot]; [containerView sendSubviewToBack:toViewSnapshot]; // Create two-part snapshots of the from- view // snapshot the left-hand side of the from- view CGRect leftSnapshotRegion = CGRectMake(0, 0, fromView.frame.size.width / 2, fromView.frame.size.height); UIView *leftHandView = [fromView resizableSnapshotViewFromRect:leftSnapshotRegion afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero]; leftHandView.frame = leftSnapshotRegion; [containerView addSubview:leftHandView]; // snapshot the right-hand side of the from- view CGRect rightSnapshotRegion = CGRectMake(fromView.frame.size.width / 2, 0, fromView.frame.size.width / 2, fromView.frame.size.height); UIView *rightHandView = [fromView resizableSnapshotViewFromRect:rightSnapshotRegion afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero]; rightHandView.frame = rightSnapshotRegion; [containerView addSubview:rightHandView]; // remove the view that was snapshotted [fromView removeFromSuperview]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ // Open the portal doors of the from-view leftHandView.frame = CGRectOffset(leftHandView.frame, - leftHandView.frame.size.width, 0); rightHandView.frame = CGRectOffset(rightHandView.frame, rightHandView.frame.size.width, 0); // zoom in the to-view toViewSnapshot.center = toView.center; toViewSnapshot.frame = toView.frame; } completion:^(BOOL finished) { // remove all the temporary views if ([transitionContext transitionWasCancelled]) { [containerView addSubview:fromView]; [self removeOtherViews:fromView]; } else { // add the real to- view and remove the snapshots [containerView addSubview:toView]; [self removeOtherViews:toView]; } // inform the context of completion [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } - (void)executeReverseAnimation:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { UIView *containerView = [transitionContext containerView]; // Add the from-view to the container [containerView addSubview:fromView]; // add the to- view and send offscreen (we need to do this in order to allow snapshotting) toView.frame = [transitionContext finalFrameForViewController:toVC]; toView.frame = CGRectOffset(toView.frame, toView.frame.size.width, 0); [containerView addSubview:toView]; // Create two-part snapshots of the to- view // snapshot the left-hand side of the to- view CGRect leftSnapshotRegion = CGRectMake(0, 0, toView.frame.size.width / 2, toView.frame.size.height); UIView *leftHandView = [toView resizableSnapshotViewFromRect:leftSnapshotRegion afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero]; leftHandView.frame = leftSnapshotRegion; // reverse animation : start from beyond the edges of the screen leftHandView.frame = CGRectOffset(leftHandView.frame, - leftHandView.frame.size.width, 0); [containerView addSubview:leftHandView]; // snapshot the right-hand side of the to- view CGRect rightSnapshotRegion = CGRectMake(toView.frame.size.width / 2, 0, toView.frame.size.width / 2, toView.frame.size.height); UIView *rightHandView = [toView resizableSnapshotViewFromRect:rightSnapshotRegion afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero]; rightHandView.frame = rightSnapshotRegion; // reverse animation : start from beyond the edges of the screen rightHandView.frame = CGRectOffset(rightHandView.frame, rightHandView.frame.size.width, 0); [containerView addSubview:rightHandView]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ // Close the portal doors of the to-view leftHandView.frame = CGRectOffset(leftHandView.frame, leftHandView.frame.size.width, 0); rightHandView.frame = CGRectOffset(rightHandView.frame, - rightHandView.frame.size.width, 0); // Zoom out the from-view CATransform3D scale = CATransform3DIdentity; fromView.layer.transform = CATransform3DScale(scale, ZOOM_SCALE, ZOOM_SCALE, 1); } completion:^(BOOL finished) { // remove all the temporary views if ([transitionContext transitionWasCancelled]) { [self removeOtherViews:fromView]; } else { [self removeOtherViews:toView]; toView.frame = containerView.bounds; } // inform the context of completion [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } // removes all the views other than the given view from the superview - (void)removeOtherViews:(UIView*)viewToKeep { UIView *containerView = viewToKeep.superview; for (UIView *view in containerView.subviews) { if (view != viewToKeep) { [view removeFromSuperview]; } } } @end ================================================ FILE: AnimationControllers/CEReversibleAnimationController.h ================================================ // // CEBaseAnimationController.h // ViewControllerTransitions // // Created by Colin Eberhardt on 09/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import /** 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. */ @interface CEReversibleAnimationController : NSObject /** The direction of the animation. */ @property (nonatomic, assign) BOOL reverse; /** The animation duration. */ @property (nonatomic, assign) NSTimeInterval duration; - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView; @end ================================================ FILE: AnimationControllers/CEReversibleAnimationController.m ================================================ // // CEBaseAnimationController.m // ViewControllerTransitions // // Created by Colin Eberhardt on 09/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEReversibleAnimationController.h" @implementation CEReversibleAnimationController - (id)init { if (self = [super init]) { self.duration = 1.0f; } return self; } - (NSTimeInterval)transitionDuration:(id)transitionContext { return self.duration; } - (void)animateTransition:(id)transitionContext { UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *toView = toVC.view; UIView *fromView = fromVC.view; [self animateTransition:transitionContext fromVC:fromVC toVC:toVC fromView:fromView toView:toView]; } - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { } @end ================================================ FILE: AnimationControllers/CETurnAnimationController.h ================================================ // // CEFlipAnimationController.h // ViewControllerTransitions // // Created by Colin Eberhardt on 08/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import #import "CEReversibleAnimationController.h" typedef NS_ENUM(NSInteger, CEDirection) { CEDirectionHorizontal, CEDirectionVertical }; /** 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. */ @interface CETurnAnimationController : CEReversibleAnimationController @property (nonatomic, assign) CEDirection flipDirection; @end ================================================ FILE: AnimationControllers/CETurnAnimationController.m ================================================ // // CEFlipAnimationController.m // ViewControllerTransitions // // Created by Colin Eberhardt on 08/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CETurnAnimationController.h" #import @implementation CETurnAnimationController - (id)init { if (self = [super init]) { self.flipDirection = CEDirectionVertical; } return self; } - (void)animateTransition:(id)transitionContext fromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC fromView:(UIView *)fromView toView:(UIView *)toView { // Add the toView to the container UIView* containerView = [transitionContext containerView]; [containerView addSubview:toView]; // Add a perspective transform CATransform3D transform = CATransform3DIdentity; transform.m34 = -0.002; [containerView.layer setSublayerTransform:transform]; // Give both VCs the same start frame CGRect initialFrame = [transitionContext initialFrameForViewController:fromVC]; fromView.frame = initialFrame; toView.frame = initialFrame; // reverse? float factor = self.reverse ? 1.0 : -1.0; // flip the to VC halfway round - hiding it toView.layer.transform = [self rotate:factor * -M_PI_2]; // animate NSTimeInterval duration = [self transitionDuration:transitionContext]; [UIView animateKeyframesWithDuration:duration delay:0.0 options:0 animations:^{ [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{ // rotate the from view fromView.layer.transform = [self rotate:factor * M_PI_2]; }]; [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{ // rotate the to view toView.layer.transform = [self rotate:0.0]; }]; } completion:^(BOOL finished) { [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }]; } - (CATransform3D) rotate:(CGFloat) angle { if (self.flipDirection == CEDirectionHorizontal) return CATransform3DMakeRotation(angle, 1.0, 0.0, 0.0); else return CATransform3DMakeRotation(angle, 0.0, 1.0, 0.0); } @end ================================================ FILE: CHANGELOG.md ================================================ # Version 1.1.0 + Added `CECardsAnimationController` + Added `CEVerticalSwipeInteractionController` + Renamed `CESwipeInteractionController` to `CEHorizontalInteractionController` # Version 1.0.0 Initial release. ================================================ FILE: InteractionControllers/CEBaseInteractionController.h ================================================ // // CEBaseInteractionController.h // ViewControllerTransitions // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import /** An enumeration that describes the navigation operation that an interaction controller should initiate. */ typedef NS_ENUM(NSInteger, CEInteractionOperation) { /** Indicates that the interaction controller should start a navigation controller 'pop' navigation. */ CEInteractionOperationPop, /** Indicates that the interaction controller should initiate a modal 'dismiss'. */ CEInteractionOperationDismiss, /** Indicates that the interaction controller should navigate between tabs. */ CEInteractionOperationTab }; /** 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. */ @interface CEBaseInteractionController : UIPercentDrivenInteractiveTransition /** Connects this interaction controller to the given view controller. @param viewController The view controller which this interaction should add a gesture recognizer to. @param operation The operation that this interaction initiates when. */ - (void)wireToViewController:(UIViewController*)viewController forOperation:(CEInteractionOperation)operation; /** This property indicates whether an interactive transition is in progress. */ @property (nonatomic, assign) BOOL interactionInProgress; @end ================================================ FILE: InteractionControllers/CEBaseInteractionController.m ================================================ // // CEBaseInteractionController.m // ViewControllerTransitions // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEBaseInteractionController.h" @implementation CEBaseInteractionController - (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation { @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] userInfo:nil]; } @end ================================================ FILE: InteractionControllers/CEHorizontalSwipeInteractionController.h ================================================ // // SwipeInteractionController.h // ILoveCatz // // Created by Colin Eberhardt on 22/08/2013. // Copyright (c) 2013 com.razeware. All rights reserved. // #import #import "CEBaseInteractionController.h" /** A horizontal swipe interaction controller. When used with a navigation controller, a right-to-left, or left-to-right swipe will cause a 'pop' navigation. When used wth a tabbar controller, right-to-left and left-to-right cause navigation between neighbouring tabs. */ @interface CEHorizontalSwipeInteractionController : CEBaseInteractionController /** Indicates whether a navigation controller 'pop' should occur on a right-to-left, or a left-to-right swipe. This property does not affect tab controller or modal interactions. */ @property (nonatomic) BOOL popOnRightToLeft; @end ================================================ FILE: InteractionControllers/CEHorizontalSwipeInteractionController.m ================================================ // // SwipeINteractionController.m // ILoveCatz // // Created by Colin Eberhardt on 22/08/2013. // Copyright (c) 2013 com.razeware. All rights reserved. // #import "CEHorizontalSwipeInteractionController.h" #import const NSString *kCEHorizontalSwipeGestureKey = @"kCEHorizontalSwipeGestureKey"; @implementation CEHorizontalSwipeInteractionController { BOOL _shouldCompleteTransition; UIViewController *_viewController; CEInteractionOperation _operation; } - (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{ self.popOnRightToLeft = YES; _operation = operation; _viewController = viewController; [self prepareGestureRecognizerInView:viewController.view]; } - (void)prepareGestureRecognizerInView:(UIView*)view { UIPanGestureRecognizer *gesture = objc_getAssociatedObject(view, (__bridge const void *)(kCEHorizontalSwipeGestureKey)); if (gesture) { [view removeGestureRecognizer:gesture]; } gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [view addGestureRecognizer:gesture]; objc_setAssociatedObject(view, (__bridge const void *)(kCEHorizontalSwipeGestureKey), gesture,OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (CGFloat)completionSpeed { return 1 - self.percentComplete; } - (void)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer { CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view.superview]; CGPoint vel = [gestureRecognizer velocityInView:gestureRecognizer.view]; switch (gestureRecognizer.state) { case UIGestureRecognizerStateBegan: { BOOL rightToLeftSwipe = vel.x < 0; // perform the required navigation operation ... if (_operation == CEInteractionOperationPop) { // for pop operation, fire on right-to-left if ((self.popOnRightToLeft && rightToLeftSwipe) || (!self.popOnRightToLeft && !rightToLeftSwipe)) { self.interactionInProgress = YES; [_viewController.navigationController popViewControllerAnimated:YES]; } } else if (_operation == CEInteractionOperationTab) { // for tab controllers, we need to determine which direction to transition if (rightToLeftSwipe) { if (_viewController.tabBarController.selectedIndex < _viewController.tabBarController.viewControllers.count - 1) { self.interactionInProgress = YES; _viewController.tabBarController.selectedIndex++; } } else { if (_viewController.tabBarController.selectedIndex > 0) { self.interactionInProgress = YES; _viewController.tabBarController.selectedIndex--; } } } else { // for dismiss, fire regardless of the translation direction self.interactionInProgress = YES; [_viewController dismissViewControllerAnimated:YES completion:nil]; } break; } case UIGestureRecognizerStateChanged: { if (self.interactionInProgress) { // compute the current position CGFloat fraction = fabs(translation.x / 200.0); fraction = fminf(fmaxf(fraction, 0.0), 1.0); _shouldCompleteTransition = (fraction > 0.5); // if an interactive transitions is 100% completed via the user interaction, for some reason // the animation completion block is not called, and hence the transition is not completed. // This glorious hack makes sure that this doesn't happen. // see: https://github.com/ColinEberhardt/VCTransitionsLibrary/issues/4 if (fraction >= 1.0) fraction = 0.99; [self updateInteractiveTransition:fraction]; } break; } case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateCancelled: if (self.interactionInProgress) { self.interactionInProgress = NO; if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) { [self cancelInteractiveTransition]; } else { [self finishInteractiveTransition]; } } break; default: break; } } @end ================================================ FILE: InteractionControllers/CEPinchInteractionController.h ================================================ // // CEPinchInteractionController.h // TransitionsDemo // // Created by Colin Eberhardt on 16/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEBaseInteractionController.h" @interface CEPinchInteractionController : CEBaseInteractionController @end ================================================ FILE: InteractionControllers/CEPinchInteractionController.m ================================================ // // CEPinchInteractionController.m // TransitionsDemo // // Created by Colin Eberhardt on 16/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEPinchInteractionController.h" #import const NSString *kCEPinchGestureKey = @"kCEPinchGestureKey"; @implementation CEPinchInteractionController{ BOOL _shouldCompleteTransition; UIViewController *_viewController; CEInteractionOperation _operation; CGFloat _startScale; } - (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{ _operation = operation; _viewController = viewController; [self prepareGestureRecognizerInView:viewController.view]; } - (void)prepareGestureRecognizerInView:(UIView*)view { UIPinchGestureRecognizer *gesture = objc_getAssociatedObject(view, (__bridge const void *)(kCEPinchGestureKey)); if (gesture) { [view removeGestureRecognizer:gesture]; } gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [view addGestureRecognizer:gesture]; objc_setAssociatedObject(view, (__bridge const void *)(kCEPinchGestureKey), gesture,OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (CGFloat)completionSpeed { return 1 - self.percentComplete; } - (void)handleGesture:(UIPinchGestureRecognizer*)gestureRecognizer { switch (gestureRecognizer.state) { case UIGestureRecognizerStateBegan: _startScale = gestureRecognizer.scale; // start an interactive transition! self.interactionInProgress = YES; // perform the required operation if (_operation == CEInteractionOperationPop) { [_viewController.navigationController popViewControllerAnimated:YES]; } else { [_viewController dismissViewControllerAnimated:YES completion:nil]; } break; case UIGestureRecognizerStateChanged: { // compute the current pinch fraction CGFloat fraction = 1.0 - gestureRecognizer.scale / _startScale; _shouldCompleteTransition = (fraction > 0.5); [self updateInteractiveTransition:fraction]; break; } case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateCancelled: self.interactionInProgress = NO; if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) { [self cancelInteractiveTransition]; } else { [self finishInteractiveTransition]; } break; default: break; } } @end ================================================ FILE: InteractionControllers/CEVerticalSwipeInteractionController.h ================================================ // // CEVerticalSwipeInteactionController.h // TransitionsDemo // // Created by Colin Eberhardt on 22/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEBaseInteractionController.h" /** A horizontal swipe interaction controller. When used with a navigation controller, a top-to-bottom swipe will cause a 'pop' navigation. This interaction controller cannot be used with a tabbar controller. That would be silly. */ @interface CEVerticalSwipeInteractionController : CEBaseInteractionController @end ================================================ FILE: InteractionControllers/CEVerticalSwipeInteractionController.m ================================================ // // CEVerticalSwipeInteactionController.m // TransitionsDemo // // Created by Colin Eberhardt on 22/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "CEVerticalSwipeInteractionController.h" #import const NSString *kCEVerticalSwipeGestureKey = @"kCEVerticalSwipeGestureKey"; @implementation CEVerticalSwipeInteractionController { BOOL _shouldCompleteTransition; UIViewController *_viewController; CEInteractionOperation _operation; } - (void)wireToViewController:(UIViewController *)viewController forOperation:(CEInteractionOperation)operation{ if (operation == CEInteractionOperationTab) { @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"You cannot use a vertical swipe interaction with a tabbar controller - that would be silly!" userInfo:nil]; } _operation = operation; _viewController = viewController; [self prepareGestureRecognizerInView:viewController.view]; } - (void)prepareGestureRecognizerInView:(UIView*)view { UIPanGestureRecognizer *gesture = objc_getAssociatedObject(view, (__bridge const void *)(kCEVerticalSwipeGestureKey)); if (gesture) { [view removeGestureRecognizer:gesture]; } gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [view addGestureRecognizer:gesture]; objc_setAssociatedObject(view, (__bridge const void *)(kCEVerticalSwipeGestureKey), gesture,OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (CGFloat)completionSpeed { return 1 - self.percentComplete; } - (void)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer { CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view.superview]; switch (gestureRecognizer.state) { case UIGestureRecognizerStateBegan: { BOOL topToBottomSwipe = translation.y > 0; // perform the required navigation operation ... if (_operation == CEInteractionOperationPop) { // for pop operation, fire on top-to-bottom if (topToBottomSwipe) { self.interactionInProgress = YES; [_viewController.navigationController popViewControllerAnimated:YES]; } } else { // for dismiss, fire regardless of the translation direction self.interactionInProgress = YES; [_viewController dismissViewControllerAnimated:YES completion:nil]; } break; } case UIGestureRecognizerStateChanged: { if (self.interactionInProgress) { // compute the current position CGFloat fraction = fabs(translation.y / 200.0); fraction = fminf(fmaxf(fraction, 0.0), 1.0); _shouldCompleteTransition = (fraction > 0.5); // if an interactive transitions is 100% completed via the user interaction, for some reason // the animation completion block is not called, and hence the transition is not completed. // This glorious hack makes sure that this doesn't happen. // see: https://github.com/ColinEberhardt/VCTransitionsLibrary/issues/4 if (fraction >= 1.0) fraction = 0.99; [self updateInteractiveTransition:fraction]; } break; } case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateCancelled: if (self.interactionInProgress) { self.interactionInProgress = NO; if (!_shouldCompleteTransition || gestureRecognizer.state == UIGestureRecognizerStateCancelled) { [self cancelInteractiveTransition]; } else { [self finishInteractiveTransition]; } } break; default: break; } } @end ================================================ FILE: MIT-LICENSE.txt ================================================ Copyright 2013 Colin Eberhardt Linq to Objective-C Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # View Controller Transitions Library With 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. The library currently contains the following animations, which can be made interactive with either a swipe or pinch gesture.
Flip Fold Crossfade Explode
Turn Cards NatGeo Portal
Cube Pan
## Contents * [A brief introduction to custom transitions](#a-brief-introduction-to-custom-transitions) * [Adding custom transitions to your project](#adding-custom-transitions-to-your-project) * [Grabbing the code](#grabbing-the-code) * [Using an animation controller](#using-an-animation-controller) * [Custom present / dismiss transitions](#custom-present--dismiss-transitions) * [Custom navigation controller transitions](#custom-navigation-controller-transitions) * [Custom tab bar controller transitions](#custom-tab-bar-controller-transitions) * [Using an interaction controller](#using-an-interaction-controller) * [Interactive dismiss transitions](#interactive-dismiss-transitions) * [Interactive pop transitions](#interactive-pop-transitions) * [Interactive tab transitions](#interactive-tab-transitions) * [Transitions library](#transitions-library) ## A brief introduction to custom transitions The 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 ;-) There are two key classes involved in a custom transition: + **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. + **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! **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. ## Adding custom transitions to your project This 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! ### Grabbing the code There are a couple of ways you can incorporate transitions from this library into your code: 1. **CocoaPods** - simply add a reference to **VCTransitionsLibrary** to your pod file. 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. ### Using an animation controller The `AnimationControllers` folder contains a number of animate controllers, which provide custom transitions, which can be integrated into your project as follows: #### Custom present / dismiss transitions The `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. #### Custom navigation controller transitions The `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. Notice 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: ```objc - (id)navigationController: (UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { // reverse the animation for 'pop' transitions _animationController.reverse = operation == UINavigationControllerOperationPop; return _animationController; } ``` #### Custom tab bar controller transitions The `UITabBarControllerDelegate` protocol has methods that can be used to provide animation controllers. Simply return an animation controller in response to the `tabBarController: animationControllerForTransitionFromViewController: toViewController:` message. In order to determine the animation direction, you can compare the indices of the two view controller as shown below: ```objc - (id )tabBarController:(UITabBarController *)tabBarController animationControllerForTransitionFromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC]; NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC]; _animationController.reverse = fromVCIndex < toVCIndex; return _animationController; } ``` ### Using an interaction controller Interaction 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. The interaction controller is responsible for adding gesture recognisers to the view and triggering the navigation in response to gestures from the user. #### Interactive dismiss transitions The `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: ```objc // instance variables, typically instantiated in your init method CEFlipAnimationController *_animationController; CESwipeInteractionController *_interactionController; - (id) animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { // allow the interaction controller to wire-up its gesture recognisers [_interactionController wireToViewController:presented forOperation:CEInteractionOperationDismiss]; _animationController.reverse = NO; return _animationController; } - (id) animationControllerForDismissedController:(UIViewController *)dismissed { _animationController.reverse = YES; return _animationController; } - (id) interactionControllerForDismissal: (id)animator { // provide the interaction controller, if an interactive transition is in progress return _interactionController.interactionInProgress ? _interactionController : nil; } ``` Note 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). #### Interactive pop transitions The `UINavigationControllerDelegate` protocol also has an equivalent method for returning interactions controllers. A typically implementation, which follows the same pattern as above, is shown: ```objc // instance variables, typically instantiated in your init method CEFlipAnimationController *_animationController; CESwipeInteractionController *_interactionController; - (id) navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { // wire the interaction controller to the to- view controller [_interactionController wireToViewController:toVC forOperation:CEInteractionOperationPop]; _animationController.reverse = operation == UINavigationControllerOperationPop; return _animationController.reverse; } - (id ) navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id )animationController { // provide the interaction controller, if an interactive transition is in progress return _interactionController.interactionInProgress ? _interactionController : nil; } ``` #### Interactive tab transitions The `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: ```objc @implementation TabBarViewController { CEFoldAnimationController *_animationController; CESwipeInteractionController *_swipeInteractionController; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { self.delegate = self; // create the interaction / animation controllers _swipeInteractionController = [CESwipeInteractionController new]; _animationController = [CEFoldAnimationController new]; _animationController.folds = 3; // observe changes in the currently presented view controller [self addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:nil]; } return self; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"selectedViewController"] ) { // wire the interaction controller to the view controller [_swipeInteractionController wireToViewController:self.selectedViewController forOperation:CEInteractionOperationTab]; } } - (id )tabBarController:(UITabBarController *)tabBarController animationControllerForTransitionFromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC]; NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC]; _animationController.reverse = fromVCIndex < toVCIndex; return _animationController; } -(id)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController:(id)animationController { return _swipeInteractionController.interactionInProgress ? _swipeInteractionController : nil; } @end ``` ## Transitions Library The following is a graphical illustration of the various transitions. All animation controllers have a `duration` property that configures the animation duration. ### Fold animation - CEFoldAnimationController Animates between the two view controllers using a paper-fold style transition. You can configure the number of folds via the `folds` property. ![](Screenshots/thumbnails/Fold/1.png) ![](Screenshots/thumbnails/Fold/2.png) ![](Screenshots/thumbnails/Fold/3.png) ![](Screenshots/thumbnails/Fold/4.png) ### Flip animation - CEFlipAnimationController Animates between the two view controllers using a page-flip transition. ![](Screenshots/thumbnails/Flip/1.png) ![](Screenshots/thumbnails/Flip/2.png) ![](Screenshots/thumbnails/Flip/3.png) ![](Screenshots/thumbnails/Flip/4.png) ### NatGeo animation - CENatGeoAnimationController Animates 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). It's an adoptation of [MHNatGeoViewControllerTransition](https://github.com/michaelhenry/MHNatGeoViewControllerTransition/) to iOS7 APIs. ![](Screenshots/thumbnails/NatGeo/1.png) ![](Screenshots/thumbnails/NatGeo/2.png) ![](Screenshots/thumbnails/NatGeo/3.png) ![](Screenshots/thumbnails/NatGeo/4.png) ### Turn animation - CETurnAnimationController 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. ![](Screenshots/thumbnails/Turn/1.png) ![](Screenshots/thumbnails/Turn/2.png) ![](Screenshots/thumbnails/Turn/3.png) ![](Screenshots/thumbnails/Turn/4.png) ![](Screenshots/thumbnails/Turn/1a.png) ![](Screenshots/thumbnails/Turn/2a.png) ![](Screenshots/thumbnails/Turn/3a.png) ![](Screenshots/thumbnails/Turn/4a.png) ### Crossfade animation - CECrossfadeAnimationController Animates between the two view controllers by performing a simple cross-fade. ![](Screenshots/thumbnails/Crossfade/1.png) ![](Screenshots/thumbnails/Crossfade/2.png) ![](Screenshots/thumbnails/Crossfade/3.png) ![](Screenshots/thumbnails/Crossfade/4.png) ### Explode animation - CEExplodeAnimationController Animates between the two view controllers by slicing the from- view controller into lots of little pieces, then randomly spinning and shrinking them. ![](Screenshots/thumbnails/Explode/1.png) ![](Screenshots/thumbnails/Explode/2.png) ![](Screenshots/thumbnails/Explode/3.png) ![](Screenshots/thumbnails/Explode/4.png) ### Cards animation - CECardsAnimationController Gives the impression of one view controller pushing the other to the back. It looks a lot more cool than these static screenshots! (courtesy of Tope - AppDesignVault) ![](Screenshots/thumbnails/Cards/1.png) ![](Screenshots/thumbnails/Cards/2.png) ![](Screenshots/thumbnails/Cards/3.png) ![](Screenshots/thumbnails/Cards/4.png) ### Portal animation - CEPortalAnimationController The top-most view controller parts in the middle to reveal the view controller beneath. (courtesy of [FreddyF](https://github.com/FredddyF)) ![](Screenshots/thumbnails/Portal/4.png) ![](Screenshots/thumbnails/Portal/3.png) ![](Screenshots/thumbnails/Portal/2.png) ![](Screenshots/thumbnails/Portal/1.png) ### Cube animation - CECubeAnimationController This transition gives the appearance of rotating the faces of a cube. (courtesy of [Andrés Brun](https://github.com/andresbrun)) ![](Screenshots/thumbnails/Cube/4.png) ![](Screenshots/thumbnails/Cube/3.png) ![](Screenshots/thumbnails/Cube/2.png) ![](Screenshots/thumbnails/Cube/1.png) ================================================ FILE: TabBarDemo/TabBarDemo/AppDelegate.h ================================================ // // AppDelegate.h // TabBarDemo // // Created by Colin Eberhardt on 17/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end ================================================ FILE: TabBarDemo/TabBarDemo/AppDelegate.m ================================================ // // AppDelegate.m // TabBarDemo // // Created by Colin Eberhardt on 17/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "AppDelegate.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } @end ================================================ FILE: TabBarDemo/TabBarDemo/Base.lproj/Main_iPad.storyboard ================================================ ================================================ FILE: TabBarDemo/TabBarDemo/Base.lproj/Main_iPhone.storyboard ================================================ 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. 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 . 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. 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 . 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. 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 . ================================================ FILE: TabBarDemo/TabBarDemo/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: TabBarDemo/TabBarDemo/Images.xcassets/LaunchImage.launchimage/Contents.json ================================================ { "images" : [ { "orientation" : "portrait", "idiom" : "iphone", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "subtype" : "retina4", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: TabBarDemo/TabBarDemo/TabBarDemo-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.scottlogic.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIMainStoryboardFile Main_iPhone UIMainStoryboardFile~ipad Main_iPad UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: TabBarDemo/TabBarDemo/TabBarDemo-Prefix.pch ================================================ // // Prefix header // // The contents of this file are implicitly included at the beginning of every source file. // #import #ifndef __IPHONE_5_0 #warning "This project uses features only available in iOS SDK 5.0 and later." #endif #ifdef __OBJC__ #import #import #endif ================================================ FILE: TabBarDemo/TabBarDemo/TabBarViewController.h ================================================ // // TabBarViewController.h // TabBarDemo // // Created by Colin Eberhardt on 18/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import @interface TabBarViewController : UITabBarController @end ================================================ FILE: TabBarDemo/TabBarDemo/TabBarViewController.m ================================================ // // TabBarViewController.m // TabBarDemo // // Created by Colin Eberhardt on 18/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "TabBarViewController.h" #import "CEFoldAnimationController.h" #import "CEHorizontalSwipeInteractionController.h" @interface TabBarViewController () @end @implementation TabBarViewController { CEFoldAnimationController *_animationController; CEHorizontalSwipeInteractionController *_swipeInteractionController; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { self.delegate = self; // create the interaction / animation controllers _swipeInteractionController = [CEHorizontalSwipeInteractionController new]; _animationController = [CEFoldAnimationController new]; _animationController.folds = 3; // observe changes in the currently presented view controller [self addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:nil]; } return self; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"selectedViewController"] ) { // wire the interaction controller to the view controller [_swipeInteractionController wireToViewController:self.selectedViewController forOperation:CEInteractionOperationTab]; } } - (id )tabBarController:(UITabBarController *)tabBarController animationControllerForTransitionFromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC]; NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC]; _animationController.reverse = fromVCIndex < toVCIndex; return _animationController; } -(id)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController:(id)animationController { return _swipeInteractionController.interactionInProgress ? _swipeInteractionController : nil; } @end ================================================ FILE: TabBarDemo/TabBarDemo/ViewController.h ================================================ // // ViewController.h // TabBarDemo // // Created by Colin Eberhardt on 17/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import @interface ViewController : UIViewController @end ================================================ FILE: TabBarDemo/TabBarDemo/ViewController.m ================================================ // // ViewController.m // TabBarDemo // // Created by Colin Eberhardt on 17/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @end ================================================ FILE: TabBarDemo/TabBarDemo/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: TabBarDemo/TabBarDemo/main.m ================================================ // // main.m // TabBarDemo // // Created by Colin Eberhardt on 17/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } ================================================ FILE: TabBarDemo/TabBarDemo.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 72EC05B717E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */; }; 72EC05B917E8DF3D00DCB9A3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05B817E8DF3D00DCB9A3 /* CoreGraphics.framework */; }; 72EC05BB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */; }; 72EC05C117E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05BF17E8DF3D00DCB9A3 /* InfoPlist.strings */; }; 72EC05C317E8DF3D00DCB9A3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05C217E8DF3D00DCB9A3 /* main.m */; }; 72EC05C717E8DF3D00DCB9A3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05C617E8DF3D00DCB9A3 /* AppDelegate.m */; }; 72EC05CA17E8DF3D00DCB9A3 /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05C817E8DF3D00DCB9A3 /* Main_iPhone.storyboard */; }; 72EC05CD17E8DF3D00DCB9A3 /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05CB17E8DF3D00DCB9A3 /* Main_iPad.storyboard */; }; 72EC05D017E8DF3D00DCB9A3 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05CF17E8DF3D00DCB9A3 /* ViewController.m */; }; 72EC05D217E8DF3D00DCB9A3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05D117E8DF3D00DCB9A3 /* Images.xcassets */; }; 72EC05D917E8DF3D00DCB9A3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05D817E8DF3D00DCB9A3 /* XCTest.framework */; }; 72EC05DA17E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */; }; 72EC05DB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */; }; 72EC05E317E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 72EC05E117E8DF3D00DCB9A3 /* InfoPlist.strings */; }; 72EC05E517E8DF3D00DCB9A3 /* TabBarDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05E417E8DF3D00DCB9A3 /* TabBarDemoTests.m */; }; 72EC05FB17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F517E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m */; }; 72EC05FC17E8DF5D00DCB9A3 /* CEExplodeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F617E8DF5D00DCB9A3 /* CEExplodeAnimationController.m */; }; 72EC05FD17E8DF5D00DCB9A3 /* CEFlipAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F717E8DF5D00DCB9A3 /* CEFlipAnimationController.m */; }; 72EC05FE17E8DF5D00DCB9A3 /* CEFoldAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F817E8DF5D00DCB9A3 /* CEFoldAnimationController.m */; }; 72EC05FF17E8DF5D00DCB9A3 /* CEReversibleAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05F917E8DF5D00DCB9A3 /* CEReversibleAnimationController.m */; }; 72EC060017E8DF5D00DCB9A3 /* CETurnAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */; }; 72EC060317E9655300DCB9A3 /* TabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060217E9655300DCB9A3 /* TabBarViewController.m */; }; 72EC060917E96C2500DCB9A3 /* CEBaseInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */; }; 72EE96DE17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 72EC05DC17E8DF3D00DCB9A3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72EC05AB17E8DF3D00DCB9A3 /* Project object */; proxyType = 1; remoteGlobalIDString = 72EC05B217E8DF3D00DCB9A3; remoteInfo = TabBarDemo; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 72EC05B317E8DF3D00DCB9A3 /* TabBarDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabBarDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 72EC05B817E8DF3D00DCB9A3 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 72EC05BE17E8DF3D00DCB9A3 /* TabBarDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TabBarDemo-Info.plist"; sourceTree = ""; }; 72EC05C017E8DF3D00DCB9A3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 72EC05C217E8DF3D00DCB9A3 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 72EC05C417E8DF3D00DCB9A3 /* TabBarDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TabBarDemo-Prefix.pch"; sourceTree = ""; }; 72EC05C517E8DF3D00DCB9A3 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 72EC05C617E8DF3D00DCB9A3 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 72EC05C917E8DF3D00DCB9A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = ""; }; 72EC05CC17E8DF3D00DCB9A3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPad.storyboard; sourceTree = ""; }; 72EC05CE17E8DF3D00DCB9A3 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 72EC05CF17E8DF3D00DCB9A3 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 72EC05D117E8DF3D00DCB9A3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 72EC05D717E8DF3D00DCB9A3 /* TabBarDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TabBarDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 72EC05D817E8DF3D00DCB9A3 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 72EC05E017E8DF3D00DCB9A3 /* TabBarDemoTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TabBarDemoTests-Info.plist"; sourceTree = ""; }; 72EC05E217E8DF3D00DCB9A3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 72EC05E417E8DF3D00DCB9A3 /* TabBarDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TabBarDemoTests.m; sourceTree = ""; }; 72EC05EF17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CECrossfadeAnimationController.h; path = ../AnimationControllers/CECrossfadeAnimationController.h; sourceTree = ""; }; 72EC05F017E8DF5D00DCB9A3 /* CEExplodeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEExplodeAnimationController.h; path = ../AnimationControllers/CEExplodeAnimationController.h; sourceTree = ""; }; 72EC05F117E8DF5D00DCB9A3 /* CEFlipAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEFlipAnimationController.h; path = ../AnimationControllers/CEFlipAnimationController.h; sourceTree = ""; }; 72EC05F217E8DF5D00DCB9A3 /* CEFoldAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEFoldAnimationController.h; path = ../AnimationControllers/CEFoldAnimationController.h; sourceTree = ""; }; 72EC05F317E8DF5D00DCB9A3 /* CEReversibleAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEReversibleAnimationController.h; path = ../AnimationControllers/CEReversibleAnimationController.h; sourceTree = ""; }; 72EC05F417E8DF5D00DCB9A3 /* CETurnAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CETurnAnimationController.h; path = ../AnimationControllers/CETurnAnimationController.h; sourceTree = ""; }; 72EC05F517E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CECrossfadeAnimationController.m; path = ../AnimationControllers/CECrossfadeAnimationController.m; sourceTree = ""; }; 72EC05F617E8DF5D00DCB9A3 /* CEExplodeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEExplodeAnimationController.m; path = ../AnimationControllers/CEExplodeAnimationController.m; sourceTree = ""; }; 72EC05F717E8DF5D00DCB9A3 /* CEFlipAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEFlipAnimationController.m; path = ../AnimationControllers/CEFlipAnimationController.m; sourceTree = ""; }; 72EC05F817E8DF5D00DCB9A3 /* CEFoldAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEFoldAnimationController.m; path = ../AnimationControllers/CEFoldAnimationController.m; sourceTree = ""; }; 72EC05F917E8DF5D00DCB9A3 /* CEReversibleAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEReversibleAnimationController.m; path = ../AnimationControllers/CEReversibleAnimationController.m; sourceTree = ""; }; 72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CETurnAnimationController.m; path = ../AnimationControllers/CETurnAnimationController.m; sourceTree = ""; }; 72EC060117E9655300DCB9A3 /* TabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarViewController.h; sourceTree = ""; }; 72EC060217E9655300DCB9A3 /* TabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabBarViewController.m; sourceTree = ""; }; 72EC060517E96C2500DCB9A3 /* CEBaseInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEBaseInteractionController.h; path = ../InteractionControllers/CEBaseInteractionController.h; sourceTree = ""; }; 72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEBaseInteractionController.m; path = ../InteractionControllers/CEBaseInteractionController.m; sourceTree = ""; }; 72EE96DC17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CEHorizontalSwipeInteractionController.h; path = ../InteractionControllers/CEHorizontalSwipeInteractionController.h; sourceTree = ""; }; 72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CEHorizontalSwipeInteractionController.m; path = ../InteractionControllers/CEHorizontalSwipeInteractionController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 72EC05B017E8DF3D00DCB9A3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72EC05B917E8DF3D00DCB9A3 /* CoreGraphics.framework in Frameworks */, 72EC05BB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */, 72EC05B717E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 72EC05D417E8DF3D00DCB9A3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 72EC05D917E8DF3D00DCB9A3 /* XCTest.framework in Frameworks */, 72EC05DB17E8DF3D00DCB9A3 /* UIKit.framework in Frameworks */, 72EC05DA17E8DF3D00DCB9A3 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 72EC05AA17E8DF3D00DCB9A3 = { isa = PBXGroup; children = ( 72EC060417E96C0C00DCB9A3 /* InteractionControllers */, 72EC05EE17E8DF4A00DCB9A3 /* AnimationControllers */, 72EC05BC17E8DF3D00DCB9A3 /* TabBarDemo */, 72EC05DE17E8DF3D00DCB9A3 /* TabBarDemoTests */, 72EC05B517E8DF3D00DCB9A3 /* Frameworks */, 72EC05B417E8DF3D00DCB9A3 /* Products */, ); sourceTree = ""; }; 72EC05B417E8DF3D00DCB9A3 /* Products */ = { isa = PBXGroup; children = ( 72EC05B317E8DF3D00DCB9A3 /* TabBarDemo.app */, 72EC05D717E8DF3D00DCB9A3 /* TabBarDemoTests.xctest */, ); name = Products; sourceTree = ""; }; 72EC05B517E8DF3D00DCB9A3 /* Frameworks */ = { isa = PBXGroup; children = ( 72EC05B617E8DF3D00DCB9A3 /* Foundation.framework */, 72EC05B817E8DF3D00DCB9A3 /* CoreGraphics.framework */, 72EC05BA17E8DF3D00DCB9A3 /* UIKit.framework */, 72EC05D817E8DF3D00DCB9A3 /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; }; 72EC05BC17E8DF3D00DCB9A3 /* TabBarDemo */ = { isa = PBXGroup; children = ( 72EC05C517E8DF3D00DCB9A3 /* AppDelegate.h */, 72EC05C617E8DF3D00DCB9A3 /* AppDelegate.m */, 72EC05C817E8DF3D00DCB9A3 /* Main_iPhone.storyboard */, 72EC05CB17E8DF3D00DCB9A3 /* Main_iPad.storyboard */, 72EC05CE17E8DF3D00DCB9A3 /* ViewController.h */, 72EC05CF17E8DF3D00DCB9A3 /* ViewController.m */, 72EC05D117E8DF3D00DCB9A3 /* Images.xcassets */, 72EC05BD17E8DF3D00DCB9A3 /* Supporting Files */, 72EC060117E9655300DCB9A3 /* TabBarViewController.h */, 72EC060217E9655300DCB9A3 /* TabBarViewController.m */, ); path = TabBarDemo; sourceTree = ""; }; 72EC05BD17E8DF3D00DCB9A3 /* Supporting Files */ = { isa = PBXGroup; children = ( 72EC05BE17E8DF3D00DCB9A3 /* TabBarDemo-Info.plist */, 72EC05BF17E8DF3D00DCB9A3 /* InfoPlist.strings */, 72EC05C217E8DF3D00DCB9A3 /* main.m */, 72EC05C417E8DF3D00DCB9A3 /* TabBarDemo-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; 72EC05DE17E8DF3D00DCB9A3 /* TabBarDemoTests */ = { isa = PBXGroup; children = ( 72EC05E417E8DF3D00DCB9A3 /* TabBarDemoTests.m */, 72EC05DF17E8DF3D00DCB9A3 /* Supporting Files */, ); path = TabBarDemoTests; sourceTree = ""; }; 72EC05DF17E8DF3D00DCB9A3 /* Supporting Files */ = { isa = PBXGroup; children = ( 72EC05E017E8DF3D00DCB9A3 /* TabBarDemoTests-Info.plist */, 72EC05E117E8DF3D00DCB9A3 /* InfoPlist.strings */, ); name = "Supporting Files"; sourceTree = ""; }; 72EC05EE17E8DF4A00DCB9A3 /* AnimationControllers */ = { isa = PBXGroup; children = ( 72EC05EF17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.h */, 72EC05F517E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m */, 72EC05F017E8DF5D00DCB9A3 /* CEExplodeAnimationController.h */, 72EC05F617E8DF5D00DCB9A3 /* CEExplodeAnimationController.m */, 72EC05F117E8DF5D00DCB9A3 /* CEFlipAnimationController.h */, 72EC05F717E8DF5D00DCB9A3 /* CEFlipAnimationController.m */, 72EC05F217E8DF5D00DCB9A3 /* CEFoldAnimationController.h */, 72EC05F817E8DF5D00DCB9A3 /* CEFoldAnimationController.m */, 72EC05F317E8DF5D00DCB9A3 /* CEReversibleAnimationController.h */, 72EC05F917E8DF5D00DCB9A3 /* CEReversibleAnimationController.m */, 72EC05F417E8DF5D00DCB9A3 /* CETurnAnimationController.h */, 72EC05FA17E8DF5D00DCB9A3 /* CETurnAnimationController.m */, ); name = AnimationControllers; sourceTree = ""; }; 72EC060417E96C0C00DCB9A3 /* InteractionControllers */ = { isa = PBXGroup; children = ( 72EE96DC17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.h */, 72EE96DD17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m */, 72EC060517E96C2500DCB9A3 /* CEBaseInteractionController.h */, 72EC060717E96C2500DCB9A3 /* CEBaseInteractionController.m */, ); name = InteractionControllers; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 72EC05B217E8DF3D00DCB9A3 /* TabBarDemo */ = { isa = PBXNativeTarget; buildConfigurationList = 72EC05E817E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget "TabBarDemo" */; buildPhases = ( 72EC05AF17E8DF3D00DCB9A3 /* Sources */, 72EC05B017E8DF3D00DCB9A3 /* Frameworks */, 72EC05B117E8DF3D00DCB9A3 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = TabBarDemo; productName = TabBarDemo; productReference = 72EC05B317E8DF3D00DCB9A3 /* TabBarDemo.app */; productType = "com.apple.product-type.application"; }; 72EC05D617E8DF3D00DCB9A3 /* TabBarDemoTests */ = { isa = PBXNativeTarget; buildConfigurationList = 72EC05EB17E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget "TabBarDemoTests" */; buildPhases = ( 72EC05D317E8DF3D00DCB9A3 /* Sources */, 72EC05D417E8DF3D00DCB9A3 /* Frameworks */, 72EC05D517E8DF3D00DCB9A3 /* Resources */, ); buildRules = ( ); dependencies = ( 72EC05DD17E8DF3D00DCB9A3 /* PBXTargetDependency */, ); name = TabBarDemoTests; productName = TabBarDemoTests; productReference = 72EC05D717E8DF3D00DCB9A3 /* TabBarDemoTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 72EC05AB17E8DF3D00DCB9A3 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Colin Eberhardt"; TargetAttributes = { 72EC05D617E8DF3D00DCB9A3 = { TestTargetID = 72EC05B217E8DF3D00DCB9A3; }; }; }; buildConfigurationList = 72EC05AE17E8DF3D00DCB9A3 /* Build configuration list for PBXProject "TabBarDemo" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 72EC05AA17E8DF3D00DCB9A3; productRefGroup = 72EC05B417E8DF3D00DCB9A3 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 72EC05B217E8DF3D00DCB9A3 /* TabBarDemo */, 72EC05D617E8DF3D00DCB9A3 /* TabBarDemoTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 72EC05B117E8DF3D00DCB9A3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 72EC05CD17E8DF3D00DCB9A3 /* Main_iPad.storyboard in Resources */, 72EC05D217E8DF3D00DCB9A3 /* Images.xcassets in Resources */, 72EC05CA17E8DF3D00DCB9A3 /* Main_iPhone.storyboard in Resources */, 72EC05C117E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72EC05D517E8DF3D00DCB9A3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 72EC05E317E8DF3D00DCB9A3 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 72EC05AF17E8DF3D00DCB9A3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72EC060317E9655300DCB9A3 /* TabBarViewController.m in Sources */, 72EE96DE17EF6A5D0097DF82 /* CEHorizontalSwipeInteractionController.m in Sources */, 72EC05D017E8DF3D00DCB9A3 /* ViewController.m in Sources */, 72EC05FF17E8DF5D00DCB9A3 /* CEReversibleAnimationController.m in Sources */, 72EC05C717E8DF3D00DCB9A3 /* AppDelegate.m in Sources */, 72EC060017E8DF5D00DCB9A3 /* CETurnAnimationController.m in Sources */, 72EC05FB17E8DF5D00DCB9A3 /* CECrossfadeAnimationController.m in Sources */, 72EC05FC17E8DF5D00DCB9A3 /* CEExplodeAnimationController.m in Sources */, 72EC05C317E8DF3D00DCB9A3 /* main.m in Sources */, 72EC060917E96C2500DCB9A3 /* CEBaseInteractionController.m in Sources */, 72EC05FE17E8DF5D00DCB9A3 /* CEFoldAnimationController.m in Sources */, 72EC05FD17E8DF5D00DCB9A3 /* CEFlipAnimationController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 72EC05D317E8DF3D00DCB9A3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 72EC05E517E8DF3D00DCB9A3 /* TabBarDemoTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 72EC05DD17E8DF3D00DCB9A3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72EC05B217E8DF3D00DCB9A3 /* TabBarDemo */; targetProxy = 72EC05DC17E8DF3D00DCB9A3 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 72EC05BF17E8DF3D00DCB9A3 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 72EC05C017E8DF3D00DCB9A3 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; 72EC05C817E8DF3D00DCB9A3 /* Main_iPhone.storyboard */ = { isa = PBXVariantGroup; children = ( 72EC05C917E8DF3D00DCB9A3 /* Base */, ); name = Main_iPhone.storyboard; sourceTree = ""; }; 72EC05CB17E8DF3D00DCB9A3 /* Main_iPad.storyboard */ = { isa = PBXVariantGroup; children = ( 72EC05CC17E8DF3D00DCB9A3 /* Base */, ); name = Main_iPad.storyboard; sourceTree = ""; }; 72EC05E117E8DF3D00DCB9A3 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 72EC05E217E8DF3D00DCB9A3 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 72EC05E617E8DF3D00DCB9A3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 72EC05E717E8DF3D00DCB9A3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; 72EC05E917E8DF3D00DCB9A3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TabBarDemo/TabBarDemo-Prefix.pch"; INFOPLIST_FILE = "TabBarDemo/TabBarDemo-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Debug; }; 72EC05EA17E8DF3D00DCB9A3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TabBarDemo/TabBarDemo-Prefix.pch"; INFOPLIST_FILE = "TabBarDemo/TabBarDemo-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; 72EC05EC17E8DF3D00DCB9A3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/TabBarDemo.app/TabBarDemo"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TabBarDemo/TabBarDemo-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); INFOPLIST_FILE = "TabBarDemoTests/TabBarDemoTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; name = Debug; }; 72EC05ED17E8DF3D00DCB9A3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/TabBarDemo.app/TabBarDemo"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TabBarDemo/TabBarDemo-Prefix.pch"; INFOPLIST_FILE = "TabBarDemoTests/TabBarDemoTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 72EC05AE17E8DF3D00DCB9A3 /* Build configuration list for PBXProject "TabBarDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 72EC05E617E8DF3D00DCB9A3 /* Debug */, 72EC05E717E8DF3D00DCB9A3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72EC05E817E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget "TabBarDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 72EC05E917E8DF3D00DCB9A3 /* Debug */, 72EC05EA17E8DF3D00DCB9A3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 72EC05EB17E8DF3D00DCB9A3 /* Build configuration list for PBXNativeTarget "TabBarDemoTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 72EC05EC17E8DF3D00DCB9A3 /* Debug */, 72EC05ED17E8DF3D00DCB9A3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 72EC05AB17E8DF3D00DCB9A3 /* Project object */; } ================================================ FILE: TabBarDemo/TabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: TabBarDemo/TabBarDemo.xcodeproj/project.xcworkspace/xcshareddata/TabBarDemo.xccheckout ================================================ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier 1E84E93D-E2FA-4FCE-803F-2A2971E98742 IDESourceControlProjectName TabBarDemo IDESourceControlProjectOriginsDictionary C9B960E113CD2F1E13B17A07CE56CB3BD674F912 https://github.com/cyndibaby905/VCTransitionsLibrary.git IDESourceControlProjectPath TabBarDemo/TabBarDemo.xcodeproj IDESourceControlProjectRelativeInstallPathDictionary C9B960E113CD2F1E13B17A07CE56CB3BD674F912 ../../.. IDESourceControlProjectURL https://github.com/cyndibaby905/VCTransitionsLibrary.git IDESourceControlProjectVersion 111 IDESourceControlProjectWCCIdentifier C9B960E113CD2F1E13B17A07CE56CB3BD674F912 IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey C9B960E113CD2F1E13B17A07CE56CB3BD674F912 IDESourceControlWCCName VCTransitionsLibrary ================================================ FILE: TabBarDemo/TabBarDemoTests/TabBarDemoTests-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.scottlogic.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 ================================================ FILE: TabBarDemo/TabBarDemoTests/TabBarDemoTests.m ================================================ // // TabBarDemoTests.m // TabBarDemoTests // // Created by Colin Eberhardt on 17/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import @interface TabBarDemoTests : XCTestCase @end @implementation TabBarDemoTests - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. } - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. [super tearDown]; } - (void)testExample { XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); } @end ================================================ FILE: TabBarDemo/TabBarDemoTests/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: TransitionsDemo/TransitionsDemo/AppDelegate.h ================================================ // // AppDelegate.h // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import // a macro for easy access to the singleton app-delegate. Yes, I know some people // consider the an anti-pattern, but this is just a simple test app, so let's // not stress about it? ;-) #define AppDelegateAccessor ((AppDelegate *)[[UIApplication sharedApplication] delegate]) @class CEReversibleAnimationController, CEBaseInteractionController; @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) CEReversibleAnimationController *settingsAnimationController; @property (strong, nonatomic) CEReversibleAnimationController *navigationControllerAnimationController; @property (strong, nonatomic) CEBaseInteractionController *navigationControllerInteractionController; @property (strong, nonatomic) CEBaseInteractionController *settingsInteractionController; @end ================================================ FILE: TransitionsDemo/TransitionsDemo/AppDelegate.m ================================================ // // AppDelegate.m // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "AppDelegate.h" #import "CECardsAnimationController.h" #import "CEVerticalSwipeInteractionController.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //AppDelegateAccessor.navigationControllerAnimationController = [CECardsAnimationController new]; //AppDelegateAccessor.navigationControllerInteractionController = [CEVerticalSwipeInteactionController new]; return YES; } @end ================================================ FILE: TransitionsDemo/TransitionsDemo/Base.lproj/Launch Screen.storyboard ================================================ ================================================ FILE: TransitionsDemo/TransitionsDemo/Base.lproj/Main_iPhone.storyboard ================================================ 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. 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. ================================================ FILE: TransitionsDemo/TransitionsDemo/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "1x" }, { "idiom" : "ipad", "size" : "76x76", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: TransitionsDemo/TransitionsDemo/Images.xcassets/LaunchImage.launchimage/Contents.json ================================================ { "images" : [ { "orientation" : "portrait", "idiom" : "iphone", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "subtype" : "retina4", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: TransitionsDemo/TransitionsDemo/NavigationController.h ================================================ // // NavigationControllerViewController.h // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import @interface NavigationController : UINavigationController @end ================================================ FILE: TransitionsDemo/TransitionsDemo/NavigationController.m ================================================ // // MyNavigationControllerViewController.m // ViewControllerTransitions // // Created by Colin Eberhardt on 09/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "NavigationController.h" #import "AppDelegate.h" #import "CEBaseInteractionController.h" #import "CEReversibleAnimationController.h" @interface NavigationController () @end @implementation NavigationController - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { self.delegate = self; } return self; } - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [self wirePopInteractionControllerTo:viewController]; } - (void)wirePopInteractionControllerTo:(UIViewController *)viewController { // when a push occurs, wire the interaction controller to the to- view controller if (!AppDelegateAccessor.navigationControllerInteractionController) { return; } [AppDelegateAccessor.navigationControllerInteractionController wireToViewController:viewController forOperation:CEInteractionOperationPop]; } - (id)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { if (AppDelegateAccessor.navigationControllerAnimationController) { AppDelegateAccessor.navigationControllerAnimationController.reverse = operation == UINavigationControllerOperationPop; } return AppDelegateAccessor.navigationControllerAnimationController; } - (id )navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id ) animationController { // if we have an interaction controller - and it is currently in progress, return it return AppDelegateAccessor.navigationControllerInteractionController && AppDelegateAccessor.navigationControllerInteractionController.interactionInProgress ? AppDelegateAccessor.navigationControllerInteractionController : nil; } @end ================================================ FILE: TransitionsDemo/TransitionsDemo/SettingsViewController.h ================================================ // // SettingsViewController.h // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import @interface SettingsViewController : UITableViewController @end ================================================ FILE: TransitionsDemo/TransitionsDemo/SettingsViewController.m ================================================ // // SettingsViewController.m // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "SettingsViewController.h" #import "NavigationController.h" #import "CEBaseInteractionController.h" #import "AppDelegate.h" #import "CEReversibleAnimationController.h" @interface SettingsViewController () @end @implementation SettingsViewController { NSArray *_animationControllers; NSArray *_interactionControllers; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { _animationControllers = @[@"None", @"Portal", @"Cards", @"Fold", @"Explode", @"Flip", @"Turn", @"Crossfade", @"NatGeo", @"Cube",@"Pan"]; _interactionControllers = @[@"None", @"HorizontalSwipe" ,@"VerticalSwipe", @"Pinch"]; } return self; } - (IBAction)doneButtonPressed:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } - (NSString *)classToTransitionName:(NSObject *)instance { if (!instance) return @"None"; NSString *animationClass = NSStringFromClass(instance.class); NSMutableString *transitionName = [[NSMutableString alloc] initWithString:animationClass]; [transitionName replaceOccurrencesOfString:@"CE" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, transitionName.length)]; [transitionName replaceOccurrencesOfString:@"AnimationController" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, transitionName.length)]; [transitionName replaceOccurrencesOfString:@"InteractionController" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, transitionName.length)]; return transitionName; } - (id)transitionNameToInstance:(NSString *)transitionName { NSString *className = [NSString stringWithFormat:@"CE%@AnimationController", transitionName]; return [[NSClassFromString(className) alloc] init]; } #pragma mark - UITableViewDelegate methods - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section < 2) { // an animation controller was selected NSString* transitionName = _animationControllers[indexPath.row]; NSString *className = [NSString stringWithFormat:@"CE%@AnimationController", transitionName]; id transitionInstance = [[NSClassFromString(className) alloc] init]; if (indexPath.section == 0) { AppDelegateAccessor.navigationControllerAnimationController = transitionInstance; } if (indexPath.section == 1) { AppDelegateAccessor.settingsAnimationController = transitionInstance; } } else { // an interaction cntroller was selected NSString* transitionName = _interactionControllers[indexPath.row]; NSString *className = [NSString stringWithFormat:@"CE%@InteractionController", transitionName]; id transitionInstance = [[NSClassFromString(className) alloc] init]; if (indexPath.section == 2) { AppDelegateAccessor.navigationControllerInteractionController = transitionInstance; } if (indexPath.section == 3) { AppDelegateAccessor.settingsInteractionController = transitionInstance; } } [self.tableView reloadData]; } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { // get the cell text NSString *transitionName = cell.textLabel.text; NSObject *currentTransition; // get the current animation / interaction controller if (indexPath.section < 2) { currentTransition = indexPath.section == 0 ? AppDelegateAccessor.navigationControllerAnimationController : AppDelegateAccessor.settingsAnimationController; } else { currentTransition = indexPath.section == 2 ? AppDelegateAccessor.navigationControllerInteractionController : AppDelegateAccessor.settingsInteractionController; } // if they match - render a tick NSString *transitionClassName = [self classToTransitionName:currentTransition]; cell.accessoryType = [transitionName isEqualToString:transitionClassName] ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; } #pragma mark - UITableViewDatasource methods - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (indexPath.section < 2) { cell.textLabel.text = _animationControllers[indexPath.row]; } else { cell.textLabel.text = _interactionControllers[indexPath.row]; } return cell; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return section < 2 ? _animationControllers.count : _interactionControllers.count; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 4; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (section == 0) return @"Navigation push / pop animation controller"; if (section == 1) return @"Settings present / dismiss animation controller"; if (section == 2) return @"Navigation push / pop interaction controller"; if (section == 3) return @"Settings present / dismiss interaction controller"; return @""; } @end ================================================ FILE: TransitionsDemo/TransitionsDemo/TransitionsDemo-Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.scottlogic.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UILaunchStoryboardName Launch Screen UIMainStoryboardFile Main_iPhone UIMainStoryboardFile~ipad Main_iPhone UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: TransitionsDemo/TransitionsDemo/TransitionsDemo-Prefix.pch ================================================ // // Prefix header // // The contents of this file are implicitly included at the beginning of every source file. // #import #ifndef __IPHONE_5_0 #warning "This project uses features only available in iOS SDK 5.0 and later." #endif #ifdef __OBJC__ #import #import #endif ================================================ FILE: TransitionsDemo/TransitionsDemo/ViewController.h ================================================ // // ViewController.h // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import #import "CEReversibleAnimationController.h" @interface ViewController : UIViewController @property (nonatomic, strong) CEReversibleAnimationController *settingsAnimationController; @end ================================================ FILE: TransitionsDemo/TransitionsDemo/ViewController.m ================================================ // // ViewController.m // ViewControllerTransitions // // Created by Colin Eberhardt on 08/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import "ViewController.h" #import "AppDelegate.h" #import "CEBaseInteractionController.h" @interface ViewController () @end static int colorIndex = 0; @implementation ViewController { NSArray* _colors; } - (void)viewDidLoad { [super viewDidLoad]; _colors = @[[UIColor redColor], [UIColor orangeColor], [UIColor yellowColor], [UIColor greenColor], [UIColor blueColor], [UIColor purpleColor]]; self.view.backgroundColor = _colors[colorIndex]; colorIndex = (colorIndex + 1) % _colors.count; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"ShowSettings"]) { UIViewController *toVC = segue.destinationViewController; toVC.transitioningDelegate = self; } [super prepareForSegue:segue sender:sender]; } #pragma mark - UIViewControllerTransitioningDelegate - (id)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { if (AppDelegateAccessor.settingsInteractionController) { [AppDelegateAccessor.settingsInteractionController wireToViewController:presented forOperation:CEInteractionOperationDismiss]; } AppDelegateAccessor.settingsAnimationController.reverse = NO; return AppDelegateAccessor.settingsAnimationController; } - (id)animationControllerForDismissedController:(UIViewController *)dismissed { AppDelegateAccessor.settingsAnimationController.reverse = YES; return AppDelegateAccessor.settingsAnimationController; } - (id)interactionControllerForDismissal:(id)animator { return AppDelegateAccessor.settingsInteractionController && AppDelegateAccessor.settingsInteractionController.interactionInProgress ? AppDelegateAccessor.settingsInteractionController : nil; } @end ================================================ FILE: TransitionsDemo/TransitionsDemo/en.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: TransitionsDemo/TransitionsDemo/main.m ================================================ // // main.m // TransitionsDemo // // Created by Colin Eberhardt on 10/09/2013. // Copyright (c) 2013 Colin Eberhardt. All rights reserved. // #import #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } ================================================ FILE: TransitionsDemo/TransitionsDemo.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 3CD5090B189FFE6900BAE35A /* CECubeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CD50909189FFE6900BAE35A /* CECubeAnimationController.m */; }; 7273232017DFBD4D0072C7FD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7273231F17DFBD4D0072C7FD /* Foundation.framework */; }; 7273232217DFBD4D0072C7FD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7273232117DFBD4D0072C7FD /* CoreGraphics.framework */; }; 7273232417DFBD4D0072C7FD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7273232317DFBD4D0072C7FD /* UIKit.framework */; }; 7273232A17DFBD4D0072C7FD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7273232817DFBD4D0072C7FD /* InfoPlist.strings */; }; 7273232C17DFBD4D0072C7FD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273232B17DFBD4D0072C7FD /* main.m */; }; 7273233017DFBD4D0072C7FD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273232F17DFBD4D0072C7FD /* AppDelegate.m */; }; 7273233317DFBD4D0072C7FD /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7273233117DFBD4D0072C7FD /* Main_iPhone.storyboard */; }; 7273233917DFBD4D0072C7FD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273233817DFBD4D0072C7FD /* ViewController.m */; }; 7273233B17DFBD4D0072C7FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7273233A17DFBD4D0072C7FD /* Images.xcassets */; }; 7273235F17DFBEBF0072C7FD /* CEFlipAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273235B17DFBEBF0072C7FD /* CEFlipAnimationController.m */; }; 7273236017DFBEBF0072C7FD /* CETurnAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */; }; 7273236317DFBEFE0072C7FD /* CEReversibleAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */; }; 7273236917DFBF140072C7FD /* CEBaseInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236617DFBF140072C7FD /* CEBaseInteractionController.m */; }; 7273236A17DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */; }; 7273236D17DFC0690072C7FD /* NavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236C17DFC0690072C7FD /* NavigationController.m */; }; 7273237017DFC4710072C7FD /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7273236F17DFC4710072C7FD /* SettingsViewController.m */; }; 72B92C661856FE98001A2D84 /* CEPortalAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72B92C651856FE98001A2D84 /* CEPortalAnimationController.m */; }; 72C15E1117E10C620056B3F9 /* CECrossfadeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */; }; 72C15E1417E10E7B0056B3F9 /* CEExplodeAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */; }; 72C15E1717E19A940056B3F9 /* CEFoldAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */; }; 72EC05A917E7B1BE00DCB9A3 /* CEPinchInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */; }; 72EE96D817EF47A60097DF82 /* CECardsAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */; }; 72EE96DB17EF66040097DF82 /* CEVerticalSwipeInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */; }; 7D0D046C1816DBA700F289A6 /* CENatGeoAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0D046B1816DBA700F289A6 /* CENatGeoAnimationController.m */; }; A993F2801B80832400553FBD /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A993F27E1B80832400553FBD /* Launch Screen.storyboard */; }; BC46683B198B2E6700A07DF8 /* CEPanAnimationController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC46683A198B2E6700A07DF8 /* CEPanAnimationController.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 3CD50909189FFE6900BAE35A /* CECubeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECubeAnimationController.m; sourceTree = ""; }; 3CD5090A189FFE6900BAE35A /* CECubeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECubeAnimationController.h; sourceTree = ""; }; 7273231C17DFBD4D0072C7FD /* TransitionsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransitionsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7273231F17DFBD4D0072C7FD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 7273232117DFBD4D0072C7FD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 7273232317DFBD4D0072C7FD /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 7273232717DFBD4D0072C7FD /* TransitionsDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TransitionsDemo-Info.plist"; sourceTree = ""; }; 7273232917DFBD4D0072C7FD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 7273232B17DFBD4D0072C7FD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 7273232D17DFBD4D0072C7FD /* TransitionsDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TransitionsDemo-Prefix.pch"; sourceTree = ""; }; 7273232E17DFBD4D0072C7FD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7273232F17DFBD4D0072C7FD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 7273233217DFBD4D0072C7FD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = ""; }; 7273233717DFBD4D0072C7FD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 7273233817DFBD4D0072C7FD /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 7273233A17DFBD4D0072C7FD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 7273234117DFBD4D0072C7FD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 7273235A17DFBEBF0072C7FD /* CEFlipAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEFlipAnimationController.h; sourceTree = ""; }; 7273235B17DFBEBF0072C7FD /* CEFlipAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEFlipAnimationController.m; sourceTree = ""; }; 7273235C17DFBEBF0072C7FD /* CETurnAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CETurnAnimationController.h; sourceTree = ""; }; 7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CETurnAnimationController.m; sourceTree = ""; }; 7273236117DFBEFE0072C7FD /* CEReversibleAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEReversibleAnimationController.h; sourceTree = ""; }; 7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEReversibleAnimationController.m; sourceTree = ""; }; 7273236517DFBF140072C7FD /* CEBaseInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEBaseInteractionController.h; sourceTree = ""; }; 7273236617DFBF140072C7FD /* CEBaseInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEBaseInteractionController.m; sourceTree = ""; }; 7273236717DFBF140072C7FD /* CEHorizontalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEHorizontalSwipeInteractionController.h; sourceTree = ""; }; 7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEHorizontalSwipeInteractionController.m; sourceTree = ""; }; 7273236B17DFC0690072C7FD /* NavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigationController.h; sourceTree = ""; }; 7273236C17DFC0690072C7FD /* NavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NavigationController.m; sourceTree = ""; }; 7273236E17DFC4710072C7FD /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; 7273236F17DFC4710072C7FD /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; 72B92C641856FE98001A2D84 /* CEPortalAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEPortalAnimationController.h; sourceTree = ""; }; 72B92C651856FE98001A2D84 /* CEPortalAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPortalAnimationController.m; sourceTree = ""; }; 72C15E0F17E10C620056B3F9 /* CECrossfadeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECrossfadeAnimationController.h; sourceTree = ""; }; 72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECrossfadeAnimationController.m; sourceTree = ""; }; 72C15E1217E10E7B0056B3F9 /* CEExplodeAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEExplodeAnimationController.h; sourceTree = ""; }; 72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEExplodeAnimationController.m; sourceTree = ""; }; 72C15E1517E19A940056B3F9 /* CEFoldAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEFoldAnimationController.h; sourceTree = ""; }; 72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEFoldAnimationController.m; sourceTree = ""; }; 72EC05A717E7B1BE00DCB9A3 /* CEPinchInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEPinchInteractionController.h; sourceTree = ""; }; 72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPinchInteractionController.m; sourceTree = ""; }; 72EE96D617EF47A60097DF82 /* CECardsAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CECardsAnimationController.h; sourceTree = ""; }; 72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CECardsAnimationController.m; sourceTree = ""; }; 72EE96D917EF66040097DF82 /* CEVerticalSwipeInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEVerticalSwipeInteractionController.h; sourceTree = ""; }; 72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEVerticalSwipeInteractionController.m; sourceTree = ""; }; 7D0D046A1816DBA700F289A6 /* CENatGeoAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CENatGeoAnimationController.h; sourceTree = ""; }; 7D0D046B1816DBA700F289A6 /* CENatGeoAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CENatGeoAnimationController.m; sourceTree = ""; }; A993F27F1B80832400553FBD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Base.lproj/Launch Screen.storyboard"; sourceTree = ""; }; BC466839198B2E6700A07DF8 /* CEPanAnimationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CEPanAnimationController.h; sourceTree = ""; }; BC46683A198B2E6700A07DF8 /* CEPanAnimationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CEPanAnimationController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 7273231917DFBD4D0072C7FD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 7273232217DFBD4D0072C7FD /* CoreGraphics.framework in Frameworks */, 7273232417DFBD4D0072C7FD /* UIKit.framework in Frameworks */, 7273232017DFBD4D0072C7FD /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 7273231317DFBD4D0072C7FD = { isa = PBXGroup; children = ( 7273236417DFBF140072C7FD /* InteractionControllers */, 7273235717DFBEBF0072C7FD /* AnimationControllers */, 7273232517DFBD4D0072C7FD /* TransitionsDemo */, 7273231E17DFBD4D0072C7FD /* Frameworks */, 7273231D17DFBD4D0072C7FD /* Products */, ); sourceTree = ""; }; 7273231D17DFBD4D0072C7FD /* Products */ = { isa = PBXGroup; children = ( 7273231C17DFBD4D0072C7FD /* TransitionsDemo.app */, ); name = Products; sourceTree = ""; }; 7273231E17DFBD4D0072C7FD /* Frameworks */ = { isa = PBXGroup; children = ( 7273231F17DFBD4D0072C7FD /* Foundation.framework */, 7273232117DFBD4D0072C7FD /* CoreGraphics.framework */, 7273232317DFBD4D0072C7FD /* UIKit.framework */, 7273234117DFBD4D0072C7FD /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; }; 7273232517DFBD4D0072C7FD /* TransitionsDemo */ = { isa = PBXGroup; children = ( 7273232E17DFBD4D0072C7FD /* AppDelegate.h */, 7273232F17DFBD4D0072C7FD /* AppDelegate.m */, A993F27E1B80832400553FBD /* Launch Screen.storyboard */, 7273233117DFBD4D0072C7FD /* Main_iPhone.storyboard */, 7273233717DFBD4D0072C7FD /* ViewController.h */, 7273233817DFBD4D0072C7FD /* ViewController.m */, 7273233A17DFBD4D0072C7FD /* Images.xcassets */, 7273232617DFBD4D0072C7FD /* Supporting Files */, 7273236B17DFC0690072C7FD /* NavigationController.h */, 7273236C17DFC0690072C7FD /* NavigationController.m */, 7273236E17DFC4710072C7FD /* SettingsViewController.h */, 7273236F17DFC4710072C7FD /* SettingsViewController.m */, ); path = TransitionsDemo; sourceTree = ""; }; 7273232617DFBD4D0072C7FD /* Supporting Files */ = { isa = PBXGroup; children = ( 7273232717DFBD4D0072C7FD /* TransitionsDemo-Info.plist */, 7273232817DFBD4D0072C7FD /* InfoPlist.strings */, 7273232B17DFBD4D0072C7FD /* main.m */, 7273232D17DFBD4D0072C7FD /* TransitionsDemo-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; 7273235717DFBEBF0072C7FD /* AnimationControllers */ = { isa = PBXGroup; children = ( BC466839198B2E6700A07DF8 /* CEPanAnimationController.h */, BC46683A198B2E6700A07DF8 /* CEPanAnimationController.m */, 3CD5090A189FFE6900BAE35A /* CECubeAnimationController.h */, 3CD50909189FFE6900BAE35A /* CECubeAnimationController.m */, 72B92C641856FE98001A2D84 /* CEPortalAnimationController.h */, 72B92C651856FE98001A2D84 /* CEPortalAnimationController.m */, 7273236117DFBEFE0072C7FD /* CEReversibleAnimationController.h */, 7273236217DFBEFE0072C7FD /* CEReversibleAnimationController.m */, 7273235A17DFBEBF0072C7FD /* CEFlipAnimationController.h */, 7273235B17DFBEBF0072C7FD /* CEFlipAnimationController.m */, 7273235C17DFBEBF0072C7FD /* CETurnAnimationController.h */, 7273235D17DFBEBF0072C7FD /* CETurnAnimationController.m */, 72C15E0F17E10C620056B3F9 /* CECrossfadeAnimationController.h */, 72C15E1017E10C620056B3F9 /* CECrossfadeAnimationController.m */, 72C15E1217E10E7B0056B3F9 /* CEExplodeAnimationController.h */, 72C15E1317E10E7B0056B3F9 /* CEExplodeAnimationController.m */, 72C15E1517E19A940056B3F9 /* CEFoldAnimationController.h */, 72C15E1617E19A940056B3F9 /* CEFoldAnimationController.m */, 72EE96D617EF47A60097DF82 /* CECardsAnimationController.h */, 72EE96D717EF47A60097DF82 /* CECardsAnimationController.m */, 7D0D046A1816DBA700F289A6 /* CENatGeoAnimationController.h */, 7D0D046B1816DBA700F289A6 /* CENatGeoAnimationController.m */, ); name = AnimationControllers; path = ../AnimationControllers; sourceTree = ""; }; 7273236417DFBF140072C7FD /* InteractionControllers */ = { isa = PBXGroup; children = ( 7273236517DFBF140072C7FD /* CEBaseInteractionController.h */, 7273236617DFBF140072C7FD /* CEBaseInteractionController.m */, 7273236717DFBF140072C7FD /* CEHorizontalSwipeInteractionController.h */, 7273236817DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m */, 72EC05A717E7B1BE00DCB9A3 /* CEPinchInteractionController.h */, 72EC05A817E7B1BE00DCB9A3 /* CEPinchInteractionController.m */, 72EE96D917EF66040097DF82 /* CEVerticalSwipeInteractionController.h */, 72EE96DA17EF66040097DF82 /* CEVerticalSwipeInteractionController.m */, ); name = InteractionControllers; path = ../InteractionControllers; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 7273231B17DFBD4D0072C7FD /* TransitionsDemo */ = { isa = PBXNativeTarget; buildConfigurationList = 7273235117DFBD4D0072C7FD /* Build configuration list for PBXNativeTarget "TransitionsDemo" */; buildPhases = ( 7273231817DFBD4D0072C7FD /* Sources */, 7273231917DFBD4D0072C7FD /* Frameworks */, 7273231A17DFBD4D0072C7FD /* Resources */, ); buildRules = ( ); dependencies = ( ); name = TransitionsDemo; productName = TransitionsDemo; productReference = 7273231C17DFBD4D0072C7FD /* TransitionsDemo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 7273231417DFBD4D0072C7FD /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Colin Eberhardt"; }; buildConfigurationList = 7273231717DFBD4D0072C7FD /* Build configuration list for PBXProject "TransitionsDemo" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 7273231317DFBD4D0072C7FD; productRefGroup = 7273231D17DFBD4D0072C7FD /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 7273231B17DFBD4D0072C7FD /* TransitionsDemo */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 7273231A17DFBD4D0072C7FD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 7273233B17DFBD4D0072C7FD /* Images.xcassets in Resources */, 7273233317DFBD4D0072C7FD /* Main_iPhone.storyboard in Resources */, A993F2801B80832400553FBD /* Launch Screen.storyboard in Resources */, 7273232A17DFBD4D0072C7FD /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 7273231817DFBD4D0072C7FD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7273236917DFBF140072C7FD /* CEBaseInteractionController.m in Sources */, 7273233917DFBD4D0072C7FD /* ViewController.m in Sources */, 72B92C661856FE98001A2D84 /* CEPortalAnimationController.m in Sources */, 72C15E1717E19A940056B3F9 /* CEFoldAnimationController.m in Sources */, 72C15E1417E10E7B0056B3F9 /* CEExplodeAnimationController.m in Sources */, 72C15E1117E10C620056B3F9 /* CECrossfadeAnimationController.m in Sources */, 72EC05A917E7B1BE00DCB9A3 /* CEPinchInteractionController.m in Sources */, 7273233017DFBD4D0072C7FD /* AppDelegate.m in Sources */, 7273232C17DFBD4D0072C7FD /* main.m in Sources */, 7273236017DFBEBF0072C7FD /* CETurnAnimationController.m in Sources */, 7273236A17DFBF140072C7FD /* CEHorizontalSwipeInteractionController.m in Sources */, 7D0D046C1816DBA700F289A6 /* CENatGeoAnimationController.m in Sources */, 7273236D17DFC0690072C7FD /* NavigationController.m in Sources */, 7273237017DFC4710072C7FD /* SettingsViewController.m in Sources */, 3CD5090B189FFE6900BAE35A /* CECubeAnimationController.m in Sources */, 72EE96DB17EF66040097DF82 /* CEVerticalSwipeInteractionController.m in Sources */, 7273235F17DFBEBF0072C7FD /* CEFlipAnimationController.m in Sources */, 7273236317DFBEFE0072C7FD /* CEReversibleAnimationController.m in Sources */, 72EE96D817EF47A60097DF82 /* CECardsAnimationController.m in Sources */, BC46683B198B2E6700A07DF8 /* CEPanAnimationController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 7273232817DFBD4D0072C7FD /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 7273232917DFBD4D0072C7FD /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; 7273233117DFBD4D0072C7FD /* Main_iPhone.storyboard */ = { isa = PBXVariantGroup; children = ( 7273233217DFBD4D0072C7FD /* Base */, ); name = Main_iPhone.storyboard; sourceTree = ""; }; A993F27E1B80832400553FBD /* Launch Screen.storyboard */ = { isa = PBXVariantGroup; children = ( A993F27F1B80832400553FBD /* Base */, ); name = "Launch Screen.storyboard"; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 7273234F17DFBD4D0072C7FD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 7273235017DFBD4D0072C7FD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; 7273235217DFBD4D0072C7FD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TransitionsDemo/TransitionsDemo-Prefix.pch"; INFOPLIST_FILE = "TransitionsDemo/TransitionsDemo-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Debug; }; 7273235317DFBD4D0072C7FD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TransitionsDemo/TransitionsDemo-Prefix.pch"; INFOPLIST_FILE = "TransitionsDemo/TransitionsDemo-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 7273231717DFBD4D0072C7FD /* Build configuration list for PBXProject "TransitionsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 7273234F17DFBD4D0072C7FD /* Debug */, 7273235017DFBD4D0072C7FD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7273235117DFBD4D0072C7FD /* Build configuration list for PBXNativeTarget "TransitionsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 7273235217DFBD4D0072C7FD /* Debug */, 7273235317DFBD4D0072C7FD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 7273231417DFBD4D0072C7FD /* Project object */; } ================================================ FILE: TransitionsDemo/TransitionsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: VCTransitionsLibrary.podspec ================================================ Pod::Spec.new do |s| s.name = 'VCTransitionsLibrary' s.version = '1.5.0' s.summary = 'A collection of interactive iOS 7 custom transitions, including flip, fold, cross-fade and more' s.author = { 'Colin Eberhardt' => 'colin.eberhardt@gmail.com' } s.source = { :git => 'https://github.com/ColinEberhardt/VCTransitionsLibrary.git', :tag => '1.5.0' } s.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt' } s.source_files = 'AnimationControllers/*.{h,m}', 'InteractionControllers/*.{h,m}' s.homepage = 'https://github.com/ColinEberhardt/VCTransitionsLibrary' s.requires_arc = true end