├── CoreLaunch ├── Assets.xcassets │ ├── Contents.json │ ├── LaunchImage.launchimage │ │ ├── Default@2x.png │ │ ├── Default-568h@2x.png │ │ ├── Default-375w-667h@2x.png │ │ ├── Default-414w-736h@3x.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── ViewController.h ├── AppDelegate.h ├── main.m ├── ViewController.m ├── CoreLaunchNew │ ├── CoreLaunchNew.h │ └── CoreLaunchNew.m ├── CoreLaunch │ ├── CoreLaunchFlip │ │ ├── CoreLaunchFlip.h │ │ ├── Lib │ │ │ ├── JDFlipNumberViewImageFactory.h │ │ │ ├── JDFlipImageView.h │ │ │ ├── UIView+JDFlipImageView.h │ │ │ ├── JDFlipNumberViewImageFactory.m │ │ │ ├── UIView+JDFlipImageView.m │ │ │ └── JDFlipImageView.m │ │ └── CoreLaunchFlip.m │ ├── CoreLaunchLite │ │ ├── CoreLaunchLite.h │ │ └── CoreLaunchLite.m │ ├── CoreLaunchPlus │ │ ├── CoreLaunchPlus.h │ │ └── CoreLaunchPlus.m │ ├── CoreLaunchPro │ │ ├── CoreLaunchPro.h │ │ ├── ProVC.h │ │ ├── PortalTransition │ │ │ ├── CYViewControllerTransitioningDelegate.h │ │ │ ├── CYNavigationControllerDelegate.h │ │ │ ├── UINavigationController+PortalTransition.h │ │ │ ├── UIViewController+PortalTransition.h │ │ │ ├── CYPortalTransitionContext.h │ │ │ ├── UINavigationController+PortalTransition.m │ │ │ ├── CYViewControllerTransitioningDelegate.m │ │ │ ├── CYNavigationControllerDelegate.m │ │ │ ├── UIViewController+PortalTransition.m │ │ │ ├── CYPortalTransitionAnimator.h │ │ │ ├── CYPortalTransitionContext.m │ │ │ └── CYPortalTransitionAnimator.m │ │ ├── CoreLaunchPro.m │ │ └── ProVC.m │ └── CoreLaunchCool │ │ ├── CoreLaunchCool.h │ │ ├── CoreLaunchCool.m │ │ ├── CALayer+Cool.h │ │ └── CALayer+Cool.m ├── Info.plist ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard └── AppDelegate.m ├── CoreLaunch.xcodeproj ├── xcuserdata │ └── Charlin.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── CoreLaunch.xcscheme ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── Charlin.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── project.pbxproj └── README.md /CoreLaunch/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreLaunch/HEAD/CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default@2x.png -------------------------------------------------------------------------------- /CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreLaunch/HEAD/CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png -------------------------------------------------------------------------------- /CoreLaunch.xcodeproj/xcuserdata/Charlin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default-375w-667h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreLaunch/HEAD/CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default-375w-667h@2x.png -------------------------------------------------------------------------------- /CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default-414w-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreLaunch/HEAD/CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Default-414w-736h@3x.png -------------------------------------------------------------------------------- /CoreLaunch.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CoreLaunch.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreLaunch/HEAD/CoreLaunch.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CoreLaunch/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /CoreLaunch/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /CoreLaunch/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /CoreLaunch/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | } 21 | 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunchNew/CoreLaunchNew.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreLaunchLite : NSObject 13 | 14 | 15 | /** 执行动画 */ 16 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image; 17 | 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/CoreLaunchFlip.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreLaunchFlip : NSObject 13 | 14 | 15 | /** 执行动画 */ 16 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image; 17 | 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchLite/CoreLaunchLite.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreLaunchLite : NSObject 13 | 14 | 15 | /** 执行动画 */ 16 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image; 17 | 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPlus/CoreLaunchPlus.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreLaunchPlus : NSObject 13 | 14 | 15 | /** 执行动画 */ 16 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image; 17 | 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/CoreLaunchPro.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreLaunchPro : NSObject 13 | 14 | 15 | /** 执行动画 */ 16 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image; 17 | 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchCool/CoreLaunchCool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreLaunchCool : NSObject 13 | 14 | 15 | /** 执行动画 */ 16 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image; 17 | 18 | 19 | 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/ProVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // ProVC.h 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ProVC : UIViewController 12 | 13 | @property (nonatomic,weak) UIWindow *window; 14 | 15 | @property (nonatomic,strong) UIViewController *rootVC; 16 | 17 | @property (nonatomic,strong) UIImageView *imageV; 18 | 19 | 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYViewControllerTransitioningDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // CYViewControllerTransitioningDelegate.h 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 24/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CYViewControllerTransitioningDelegate : NSObject 12 | 13 | @property (nonatomic, weak) UIViewController *viewController; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYNavigationControllerDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // CYNavigationControllerDelegate.h 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 24/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CYNavigationControllerDelegate : NSObject 13 | 14 | @property (nonatomic, weak) UINavigationController *navController; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/UINavigationController+PortalTransition.h: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+PortalTransition.h 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UINavigationController (PortalTransition) 12 | 13 | -(void)pushPortalTransitionViewController:(UIViewController *)viewControllerToPush completion:(void (^)(void))completion; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/UIViewController+PortalTransition.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+PortalTransition.h 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIViewController (PortalTransition) 12 | 13 | - (void) presentPortalTransitionViewController: (UIViewController *)viewControllerToPresent completion:(void (^)(void))completion; 14 | 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /CoreLaunch.xcodeproj/xcuserdata/Charlin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CoreLaunch.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 8919AF8F1BD088A80068A38E 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/Lib/JDFlipNumberViewImageFactory.h: -------------------------------------------------------------------------------- 1 | // 2 | // JDFlipNumberViewImageFactory.h 3 | // FlipNumberViewExample 4 | // 5 | // Created by Markus Emrich on 05.12.12. 6 | // Copyright (c) 2012 markusemrich. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | @interface JDFlipNumberViewImageFactory : NSObject 12 | 13 | + (JDFlipNumberViewImageFactory*)sharedInstance; 14 | 15 | - (CGSize)imageSizeForBundleNamed:(NSString*)bundleName; 16 | - (NSArray*)topImagesForBundleNamed:(NSString*)bundleName; 17 | - (NSArray*)bottomImagesForBundleNamed:(NSString*)bundleName; 18 | 19 | - (void)generateImagesFromBundleNamed:(NSString*)bundleName; 20 | - (NSArray*)generateImagesFromImage:(UIImage*)image; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /CoreLaunch/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYPortalTransitionContext.h: -------------------------------------------------------------------------------- 1 | // 2 | // CYPortalTransitionContext.h 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CYPortalTransitionContext : NSObject 12 | 13 | @property (nonatomic, copy) void(^completionBlock)(BOOL compeleted); 14 | //Designed Initilizer 15 | - (instancetype)initWithFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController; 16 | @property (nonatomic, weak) UIView *containerView; 17 | @property (nonatomic, getter=isInteractive) BOOL interactive; 18 | @property (nonatomic, getter=isAnimated) BOOL animated; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/Lib/JDFlipImageView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JDFlipImageView.h 3 | // FlipNumberViewExample 4 | // 5 | // Created by Markus Emrich on 16.11.13. 6 | // Copyright (c) 2013 markusemrich. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern const NSTimeInterval JDFlipImageViewDefaultFlipDuration; 12 | 13 | typedef void(^JDFlipImageViewCompletionBlock)(BOOL finished); 14 | 15 | typedef NS_ENUM(NSInteger, JDFlipImageViewFlipDirection) { 16 | JDFlipImageViewFlipDirectionDown, 17 | JDFlipImageViewFlipDirectionUp 18 | }; 19 | 20 | @interface JDFlipImageView : UIView 21 | 22 | @property (nonatomic, strong) UIImage *image; 23 | @property (nonatomic, assign) JDFlipImageViewFlipDirection flipDirection; 24 | @property (nonatomic, assign) NSUInteger zDistance; 25 | 26 | - (id)initWithImage:(UIImage*)image; 27 | 28 | - (void)setImageAnimated:(UIImage*)image; 29 | 30 | - (void)setImageAnimated:(UIImage*)image 31 | completion:(JDFlipImageViewCompletionBlock)completion; 32 | 33 | - (void)setImageAnimated:(UIImage*)image 34 | duration:(CGFloat)duration 35 | completion:(JDFlipImageViewCompletionBlock)completion; 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /CoreLaunch/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeRight 35 | UIInterfaceOrientationLandscapeLeft 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/UINavigationController+PortalTransition.m: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+PortalTransition.m 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import "UINavigationController+PortalTransition.h" 10 | #import "CYPortalTransitionAnimator.h" 11 | #import "CYPortalTransitionContext.h" 12 | 13 | @implementation UINavigationController (PortalTransition) 14 | 15 | -(void)pushPortalTransitionViewController:(UIViewController *)viewControllerToPush completion:(void (^)(void))completion { 16 | UIViewController *fromViewController = self.topViewController; 17 | CYPortalTransitionContext *transitionContext = [[CYPortalTransitionContext alloc] initWithFromViewController:fromViewController toViewController:viewControllerToPush]; 18 | transitionContext.animated = YES; 19 | transitionContext.interactive = NO; 20 | transitionContext.completionBlock = ^(BOOL didCompleted){ 21 | if (didCompleted && completion) { 22 | completion(); 23 | } 24 | }; 25 | 26 | CYPortalTransitionAnimator *animator = [CYPortalTransitionAnimator new]; 27 | animator.portalTransitionStyle = CYPortalTransitionStylePush; 28 | [animator animateTransition:transitionContext]; 29 | } 30 | @end 31 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYViewControllerTransitioningDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // CYViewControllerTransitioningDelegate.m 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 24/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import "CYViewControllerTransitioningDelegate.h" 10 | #import "CYPortalTransitionAnimator.h" 11 | 12 | @interface CYViewControllerTransitioningDelegate () 13 | 14 | @property (nonatomic, strong) CYPortalTransitionAnimator *animator; 15 | 16 | @end 17 | 18 | @implementation CYViewControllerTransitioningDelegate 19 | 20 | - (instancetype)init 21 | { 22 | self = [super init]; 23 | if (self) { 24 | self.animator = [[CYPortalTransitionAnimator alloc] init]; 25 | } 26 | return self; 27 | } 28 | 29 | - (id )animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;{ 30 | return self.animator; 31 | } 32 | 33 | - (id )animationControllerForDismissedController:(UIViewController *)dismissed;{ 34 | return nil; 35 | } 36 | 37 | -(void)setViewController:(UIViewController *)viewController{ 38 | _viewController = viewController; 39 | _viewController.transitioningDelegate = self; 40 | } 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYNavigationControllerDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // CYNavigationControllerDelegate.m 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 24/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import "CYNavigationControllerDelegate.h" 10 | #import "CYPortalTransitionAnimator.h" 11 | 12 | @interface CYNavigationControllerDelegate () 13 | 14 | @property (nonatomic, strong) CYPortalTransitionAnimator *animator; 15 | 16 | @end 17 | 18 | @implementation CYNavigationControllerDelegate 19 | 20 | - (instancetype)init 21 | { 22 | self = [super init]; 23 | if (self) { 24 | self.animator = [[CYPortalTransitionAnimator alloc] init]; 25 | } 26 | return self; 27 | } 28 | 29 | -(id)navigationController:(UINavigationController *)navigationController 30 | animationControllerForOperation:(UINavigationControllerOperation)operation 31 | fromViewController:(UIViewController *)fromVC 32 | toViewController:(UIViewController *)toVC{ 33 | if (operation == UINavigationControllerOperationPush) { 34 | return self.animator; 35 | }else { 36 | return nil; 37 | } 38 | } 39 | 40 | -(void)setNavController:(UINavigationController *)navController{ 41 | _navController = navController; 42 | _navController.delegate = self; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/CoreLaunchPro.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreLaunchPro.h" 10 | #import "ProVC.h" 11 | 12 | #define iphone4x_3_5 ([UIScreen mainScreen].bounds.size.height==480.0f) 13 | 14 | #define iphone5x_4_0 ([UIScreen mainScreen].bounds.size.height==568.0f) 15 | 16 | #define iphone6_4_7 ([UIScreen mainScreen].bounds.size.height==667.0f) 17 | 18 | #define iphone6Plus_5_5 ([UIScreen mainScreen].bounds.size.height==736.0f || [UIScreen mainScreen].bounds.size.height==414.0f) 19 | 20 | @implementation CoreLaunchPro 21 | 22 | 23 | /** 执行动画 */ 24 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image{ 25 | 26 | UIViewController *rootVC = window.rootViewController; 27 | 28 | ProVC *proVC = [[ProVC alloc] init]; 29 | 30 | proVC.window = window; 31 | 32 | proVC.rootVC = rootVC; 33 | 34 | proVC.imageV.image = image==nil?[self launchImage]:image; 35 | 36 | window.rootViewController = proVC; 37 | 38 | } 39 | 40 | /** 41 | * 获取启动图片 42 | */ 43 | +(UIImage *)launchImage{ 44 | 45 | NSString *imageName=@"LaunchImage-700"; 46 | 47 | if(iphone5x_4_0) imageName=@"LaunchImage-700-568h"; 48 | 49 | if(iphone6_4_7) imageName = @"LaunchImage-800-667h"; 50 | 51 | if(iphone6Plus_5_5) imageName = @"LaunchImage-800-Portrait-736h"; 52 | 53 | UIImage *image = [UIImage imageNamed:imageName]; 54 | 55 | NSAssert(image != nil, @"Charlin Feng提示您:请添加启动图片!"); 56 | 57 | return image; 58 | } 59 | 60 | 61 | 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/UIViewController+PortalTransition.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+PortalTransition.m 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import "UIViewController+PortalTransition.h" 10 | #import "CYPortalTransitionContext.h" 11 | #import "CYPortalTransitionAnimator.h" 12 | 13 | @implementation UIViewController (PortalTransition) 14 | 15 | - (void) presentPortalTransitionViewController: (UIViewController *)viewControllerToPresent completion:(void (^)(void))completion 16 | { 17 | //Get up most parentViewController 18 | UIViewController *fromViewController = self; 19 | while (nil != [fromViewController parentViewController]) { 20 | fromViewController = [fromViewController parentViewController]; 21 | } 22 | CYPortalTransitionContext *transitionContext = [[CYPortalTransitionContext alloc] initWithFromViewController:fromViewController toViewController:viewControllerToPresent]; 23 | transitionContext.animated = YES; 24 | transitionContext.interactive = NO; 25 | transitionContext.completionBlock = ^(BOOL didCompleted){ 26 | if (didCompleted) { 27 | [viewControllerToPresent didMoveToParentViewController:self]; 28 | 29 | if (completion) { 30 | completion(); 31 | } 32 | } 33 | }; 34 | 35 | CYPortalTransitionAnimator *animator = [CYPortalTransitionAnimator new]; 36 | animator.portalTransitionStyle = CYPortalTransitionStylePresent; 37 | [animator animateTransition:transitionContext]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/ProVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // ProVC.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "ProVC.h" 10 | #import "UIViewController+PortalTransition.h" 11 | #import "CYViewControllerTransitioningDelegate.h" 12 | 13 | @interface ProVC () 14 | 15 | @property (nonatomic, strong) CYViewControllerTransitioningDelegate *viewControllerTransitionDelegate; 16 | 17 | @end 18 | 19 | @implementation ProVC 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.view.backgroundColor = [UIColor redColor]; 25 | 26 | __weak typeof(self) weakSelf=self; 27 | 28 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 29 | 30 | weakSelf.rootVC.modalPresentationStyle = UIModalPresentationCustom; 31 | 32 | weakSelf.viewControllerTransitionDelegate.viewController = weakSelf.rootVC; 33 | 34 | [weakSelf presentPortalTransitionViewController:self.rootVC completion:^{ 35 | 36 | [weakSelf.rootVC dismissViewControllerAnimated:NO completion:^{ 37 | weakSelf.window.rootViewController = weakSelf.rootVC; 38 | }]; 39 | }]; 40 | }); 41 | 42 | } 43 | 44 | -(UIImageView *)imageV{ 45 | 46 | if(_imageV == nil){ 47 | 48 | _imageV = [[UIImageView alloc] init]; 49 | _imageV.frame = [UIScreen mainScreen].bounds; 50 | [self.view addSubview:_imageV]; 51 | } 52 | 53 | return _imageV; 54 | } 55 | 56 | -(void)dealloc{ 57 | NSLog(@"ProVC dealloc"); 58 | } 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /CoreLaunch/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYPortalTransitionAnimator.h: -------------------------------------------------------------------------------- 1 | // 2 | // CYPortalTransition.h 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef enum : NSUInteger { 12 | CYPortalTransitionStyleDelegate, 13 | CYPortalTransitionStylePresent, 14 | CYPortalTransitionStylePush, 15 | } CYPortalTransitionStyle; 16 | 17 | 18 | @interface CYPortalTransitionAnimator : NSObject 19 | 20 | /** 21 | * Gap between the target view and reflection, default is 8.0 22 | */ 23 | @property (nonatomic, assign) CGFloat reflectionGap; 24 | 25 | 26 | /** 27 | * ReflectionHeight / targetViewHeight, default is 0.5 28 | */ 29 | @property (nonatomic, assign) CGFloat reflectionScale; 30 | 31 | /** 32 | * Opacity of reflectionView, default is 0.5 33 | */ 34 | @property (nonatomic, assign) CGFloat reflectionAlpha; 35 | 36 | /** 37 | * Target view size / origin view size, default is 0.5 38 | */ 39 | @property (nonatomic, assign) CGFloat targetViewScale; 40 | 41 | /** 42 | * Portal animation duration, default is 2.0 43 | */ 44 | @property (nonatomic, assign) CGFloat portalAnimationDuration; 45 | 46 | /** 47 | * Animation duration, default is 3.O 48 | */ 49 | @property (nonatomic, assign) CGFloat scaleAnimationDuration; 50 | 51 | /** 52 | * Target view scale animation delay after portal animation, default is 0.5 53 | */ 54 | @property (nonatomic, assign) CGFloat delay; 55 | 56 | /** 57 | * UIViewController Transition Style, support UINavigationViewController Push, UIViewController present 58 | */ 59 | @property (nonatomic, assign) CYPortalTransitionStyle portalTransitionStyle; 60 | 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchCool/CoreLaunchCool.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreLaunchCool.h" 10 | #import "CALayer+Cool.h" 11 | 12 | #define iphone4x_3_5 ([UIScreen mainScreen].bounds.size.height==480.0f) 13 | 14 | #define iphone5x_4_0 ([UIScreen mainScreen].bounds.size.height==568.0f) 15 | 16 | #define iphone6_4_7 ([UIScreen mainScreen].bounds.size.height==667.0f) 17 | 18 | #define iphone6Plus_5_5 ([UIScreen mainScreen].bounds.size.height==736.0f || [UIScreen mainScreen].bounds.size.height==414.0f) 19 | 20 | @implementation CoreLaunchCool 21 | 22 | 23 | /** 执行动画 */ 24 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image{ 25 | 26 | UIImageView *imageV = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 27 | 28 | imageV.image = image==nil?[self launchImage]:image; 29 | 30 | [window.rootViewController.view addSubview:imageV]; 31 | 32 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 33 | 34 | [imageV removeFromSuperview]; 35 | 36 | [window.layer transitionWithAnimType:TransitionAnimTypeRamdom subType:TransitionSubtypesFromRamdom curve:TransitionCurveRamdom duration:1.6]; 37 | }); 38 | } 39 | 40 | 41 | 42 | 43 | /** 44 | * 获取启动图片 45 | */ 46 | +(UIImage *)launchImage{ 47 | 48 | NSString *imageName=@"LaunchImage-700"; 49 | 50 | if(iphone5x_4_0) imageName=@"LaunchImage-700-568h"; 51 | 52 | if(iphone6_4_7) imageName = @"LaunchImage-800-667h"; 53 | 54 | if(iphone6Plus_5_5) imageName = @"LaunchImage-800-Portrait-736h"; 55 | 56 | UIImage *image = [UIImage imageNamed:imageName]; 57 | 58 | NSAssert(image != nil, @"Charlin Feng提示您:请添加启动图片!"); 59 | 60 | return image; 61 | } 62 | 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /CoreLaunch/Assets.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "extent" : "full-screen", 5 | "idiom" : "iphone", 6 | "subtype" : "736h", 7 | "filename" : "Default-414w-736h@3x.png", 8 | "minimum-system-version" : "8.0", 9 | "orientation" : "portrait", 10 | "scale" : "3x" 11 | }, 12 | { 13 | "orientation" : "landscape", 14 | "idiom" : "iphone", 15 | "extent" : "full-screen", 16 | "minimum-system-version" : "8.0", 17 | "subtype" : "736h", 18 | "scale" : "3x" 19 | }, 20 | { 21 | "extent" : "full-screen", 22 | "idiom" : "iphone", 23 | "subtype" : "667h", 24 | "filename" : "Default-375w-667h@2x.png", 25 | "minimum-system-version" : "8.0", 26 | "orientation" : "portrait", 27 | "scale" : "2x" 28 | }, 29 | { 30 | "orientation" : "portrait", 31 | "idiom" : "iphone", 32 | "filename" : "Default@2x.png", 33 | "extent" : "full-screen", 34 | "minimum-system-version" : "7.0", 35 | "scale" : "2x" 36 | }, 37 | { 38 | "extent" : "full-screen", 39 | "idiom" : "iphone", 40 | "subtype" : "retina4", 41 | "filename" : "Default-568h@2x.png", 42 | "minimum-system-version" : "7.0", 43 | "orientation" : "portrait", 44 | "scale" : "2x" 45 | }, 46 | { 47 | "orientation" : "portrait", 48 | "idiom" : "iphone", 49 | "extent" : "full-screen", 50 | "scale" : "1x" 51 | }, 52 | { 53 | "orientation" : "portrait", 54 | "idiom" : "iphone", 55 | "extent" : "full-screen", 56 | "scale" : "2x" 57 | }, 58 | { 59 | "orientation" : "portrait", 60 | "idiom" : "iphone", 61 | "extent" : "full-screen", 62 | "subtype" : "retina4", 63 | "scale" : "2x" 64 | } 65 | ], 66 | "info" : { 67 | "version" : 1, 68 | "author" : "xcode" 69 | } 70 | } -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYPortalTransitionContext.m: -------------------------------------------------------------------------------- 1 | // 2 | // CYPortalTransitionContext.m 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import "CYPortalTransitionContext.h" 10 | 11 | @interface CYPortalTransitionContext () 12 | 13 | @property (nonatomic, strong) NSDictionary *privateViewControllersDictionary; 14 | @property (nonatomic, assign) UIModalPresentationStyle presentationStyle; 15 | 16 | @end 17 | 18 | @implementation CYPortalTransitionContext 19 | 20 | - (instancetype)initWithFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController { 21 | if (self = [super init]) { 22 | self.privateViewControllersDictionary = @{ 23 | UITransitionContextFromViewControllerKey:fromViewController, 24 | UITransitionContextToViewControllerKey: toViewController}; 25 | self.containerView = [fromViewController.view superview]; 26 | } 27 | return self; 28 | } 29 | 30 | 31 | - (UIViewController *)viewControllerForKey:(NSString *)key{ 32 | return self.privateViewControllersDictionary[key]; 33 | } 34 | 35 | -(void)completeTransition:(BOOL)didComplete{ 36 | if (self.completionBlock) { 37 | self.completionBlock(didComplete); 38 | } 39 | } 40 | 41 | - (CGRect)initialFrameForViewController:(UIViewController *)vc;{ 42 | return self.containerView.bounds; 43 | } 44 | 45 | - (CGRect)finalFrameForViewController:(UIViewController *)vc;{ 46 | return self.containerView.bounds; 47 | } 48 | 49 | //Can not be canceled 50 | -(BOOL)transitionWasCancelled { 51 | return NO; 52 | } 53 | 54 | // Supress warnings by implementing empty interaction methods for the remainder of the protocol: 55 | // Currently interactive transition not supported 56 | - (void)updateInteractiveTransition:(CGFloat)percentComplete {} 57 | - (void)finishInteractiveTransition {} 58 | - (void)cancelInteractiveTransition {} 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/Lib/UIView+JDFlipImageView.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+JDFlipImageView.h 3 | // FlipNumberViewExample 4 | // 5 | // Created by Markus on 19.11.13. 6 | // Copyright (c) 2013 markusemrich. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "JDFlipImageView.h" 11 | 12 | typedef void(^JDFlipImageViewViewUpdateBlock)(void); 13 | 14 | @interface UIView (JDFlipImageView) 15 | 16 | // Flip transition to another view 17 | 18 | - (void)flipToView:(UIView*)view; 19 | 20 | - (void)flipToView:(UIView*)view 21 | completion:(JDFlipImageViewCompletionBlock)completion; 22 | 23 | - (void)flipToView:(UIView*)view 24 | duration:(CGFloat)duration 25 | completion:(JDFlipImageViewCompletionBlock)completion; 26 | 27 | - (void)flipToView:(UIView*)view 28 | duration:(CGFloat)duration 29 | direction:(JDFlipImageViewFlipDirection)direction 30 | completion:(JDFlipImageViewCompletionBlock)completion; 31 | 32 | - (void)flipToView:(UIView*)view 33 | duration:(CGFloat)duration 34 | removeView:(BOOL)removeFromSuperView 35 | direction:(JDFlipImageViewFlipDirection)direction 36 | completion:(JDFlipImageViewCompletionBlock)completion; 37 | 38 | // Update a view using a flip animation 39 | 40 | - (void)updateWithFlipAnimationUpdates:(JDFlipImageViewViewUpdateBlock)updates; 41 | 42 | - (void)updateWithFlipAnimationUpdates:(JDFlipImageViewViewUpdateBlock)updates 43 | completion:(JDFlipImageViewCompletionBlock)completion; 44 | 45 | - (void)updateWithFlipAnimationDuration:(CGFloat)duration 46 | updates:(JDFlipImageViewViewUpdateBlock)updates 47 | completion:(JDFlipImageViewCompletionBlock)completion; 48 | 49 | - (void)updateWithFlipAnimationDuration:(CGFloat)duration 50 | direction:(JDFlipImageViewFlipDirection)direction 51 | updates:(JDFlipImageViewViewUpdateBlock)updates 52 | completion:(JDFlipImageViewCompletionBlock)completion; 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunchNew/CoreLaunchNew.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreLaunchLite.h" 10 | 11 | #define iphone4x_3_5 ([UIScreen mainScreen].bounds.size.height==480.0f) 12 | 13 | #define iphone5x_4_0 ([UIScreen mainScreen].bounds.size.height==568.0f) 14 | 15 | #define iphone6_4_7 ([UIScreen mainScreen].bounds.size.height==667.0f) 16 | 17 | #define iphone6Plus_5_5 ([UIScreen mainScreen].bounds.size.height==736.0f || [UIScreen mainScreen].bounds.size.height==414.0f) 18 | 19 | @implementation CoreLaunchLite 20 | 21 | 22 | /** 执行动画 */ 23 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image{ 24 | 25 | UIImageView *imageV = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 26 | 27 | imageV.image = image==nil?[self launchImage]:image; 28 | 29 | [window.rootViewController.view addSubview:imageV]; 30 | 31 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 32 | 33 | 34 | [UIView animateWithDuration:1.5 animations:^{ 35 | 36 | [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 37 | 38 | imageV.transform=CGAffineTransformMakeScale(2.f, 2.f); 39 | imageV.alpha = 0; 40 | 41 | 42 | } completion:^(BOOL finished) { 43 | 44 | [imageV removeFromSuperview]; 45 | 46 | }]; 47 | 48 | }); 49 | } 50 | 51 | 52 | 53 | 54 | /** 55 | * 获取启动图片 56 | */ 57 | +(UIImage *)launchImage{ 58 | 59 | NSString *imageName=@"LaunchImage-700"; 60 | 61 | if(iphone5x_4_0) imageName=@"LaunchImage-700-568h"; 62 | 63 | if(iphone6_4_7) imageName = @"LaunchImage-800-667h"; 64 | 65 | if(iphone6Plus_5_5) imageName = @"LaunchImage-800-Portrait-736h"; 66 | 67 | UIImage *image = [UIImage imageNamed:imageName]; 68 | 69 | NSAssert(image != nil, @"Charlin Feng提示您:请添加启动图片!"); 70 | 71 | return image; 72 | } 73 | 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchLite/CoreLaunchLite.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreLaunchLite.h" 10 | 11 | #define iphone4x_3_5 ([UIScreen mainScreen].bounds.size.height==480.0f) 12 | 13 | #define iphone5x_4_0 ([UIScreen mainScreen].bounds.size.height==568.0f) 14 | 15 | #define iphone6_4_7 ([UIScreen mainScreen].bounds.size.height==667.0f) 16 | 17 | #define iphone6Plus_5_5 ([UIScreen mainScreen].bounds.size.height==736.0f || [UIScreen mainScreen].bounds.size.height==414.0f) 18 | 19 | @implementation CoreLaunchLite 20 | 21 | 22 | /** 执行动画 */ 23 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image{ 24 | 25 | UIImageView *imageV = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 26 | 27 | imageV.image = image==nil?[self launchImage]:image; 28 | 29 | [window.rootViewController.view addSubview:imageV]; 30 | 31 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 32 | 33 | 34 | [UIView animateWithDuration:1.5 animations:^{ 35 | 36 | [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 37 | 38 | imageV.transform=CGAffineTransformMakeScale(2.f, 2.f); 39 | imageV.alpha = 0; 40 | 41 | 42 | } completion:^(BOOL finished) { 43 | 44 | [imageV removeFromSuperview]; 45 | 46 | }]; 47 | 48 | }); 49 | } 50 | 51 | 52 | 53 | 54 | /** 55 | * 获取启动图片 56 | */ 57 | +(UIImage *)launchImage{ 58 | 59 | NSString *imageName=@"LaunchImage-700"; 60 | 61 | if(iphone5x_4_0) imageName=@"LaunchImage-700-568h"; 62 | 63 | if(iphone6_4_7) imageName = @"LaunchImage-800-667h"; 64 | 65 | if(iphone6Plus_5_5) imageName = @"LaunchImage-800-Portrait-736h"; 66 | 67 | UIImage *image = [UIImage imageNamed:imageName]; 68 | 69 | NSAssert(image != nil, @"Charlin Feng提示您:请添加启动图片!"); 70 | 71 | return image; 72 | } 73 | 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchCool/CALayer+Cool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CALayer+Transition.h 3 | // Carpenter 4 | // 5 | // Created by 冯成林 on 15/4/23. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CALayer (Cool) 12 | 13 | /* 14 | * 动画类型 15 | */ 16 | typedef enum{ 17 | 18 | //水波 19 | TransitionAnimTypeRippleEffect=0, 20 | 21 | //吸走 22 | TransitionAnimTypeSuckEffect, 23 | 24 | //翻开书本 25 | TransitionAnimTypePageCurl, 26 | 27 | //正反翻转 28 | TransitionAnimTypeOglFlip, 29 | 30 | //正方体 31 | TransitionAnimTypeCube, 32 | 33 | //push推开 34 | TransitionAnimTypeReveal, 35 | 36 | //合上书本 37 | TransitionAnimTypePageUnCurl, 38 | 39 | //随机 40 | TransitionAnimTypeRamdom, 41 | 42 | }TransitionAnimType; 43 | 44 | 45 | 46 | 47 | /* 48 | * 动画方向 49 | */ 50 | typedef enum{ 51 | 52 | //从上 53 | TransitionSubtypesFromTop=0, 54 | 55 | //从左 56 | TransitionSubtypesFromLeft, 57 | 58 | //从下 59 | TransitionSubtypesFromBotoom, 60 | 61 | //从右 62 | TransitionSubtypesFromRight, 63 | 64 | //随机 65 | TransitionSubtypesFromRamdom, 66 | 67 | }TransitionSubType; 68 | 69 | 70 | /* 71 | * 动画曲线 72 | */ 73 | typedef enum { 74 | 75 | //默认 76 | TransitionCurveDefault, 77 | 78 | //缓进 79 | TransitionCurveEaseIn, 80 | 81 | //缓出 82 | TransitionCurveEaseOut, 83 | 84 | //缓进缓出 85 | TransitionCurveEaseInEaseOut, 86 | 87 | //线性 88 | TransitionCurveLinear, 89 | 90 | //随机 91 | TransitionCurveRamdom, 92 | 93 | }TransitionCurve; 94 | 95 | 96 | 97 | 98 | /** 99 | * 转场动画 100 | * 101 | * @param animType 转场动画类型 102 | * @param subtype 转动动画方向 103 | * @param curve 转动动画曲线 104 | * @param duration 转动动画时长 105 | * 106 | * @return 转场动画实例 107 | */ 108 | -(CATransition *)transitionWithAnimType:(TransitionAnimType)animType subType:(TransitionSubType)subType curve:(TransitionCurve)curve duration:(CGFloat)duration; 109 | 110 | @end 111 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![image](https://github.com/CharlinFeng/Resource/blob/master/CoreLaunch/logo.png)

2 | 3 | 一键启动动画 (持续关注[信息公告牌](https://github.com/CharlinFeng/Show)) 4 | ========== 5 | ### .Xcode7 6 | ### .Objective-C 7 | ### .iOS 7.0~ 8 | 9 |


10 | 快速集成 11 | ========== 12 | 13 | ###您只需一句代码即可集成! 14 |
15 | #### 1.请不要直接拖拽`CoreLaunch`文件夹到您的项目,此项目是5 in 1合集。如果您是测试,你可以直接拖拽`CoreLaunch`文件夹到您的项目。 16 |
17 | #### 2.再次请您明确,`CoreLaunch`仅仅是一个统称,`CoreLaunch`有5种效果任你挑选,并且这5种效果是放在5个文件夹,他们是相互独立的。 18 | 19 | > .Lite版
20 | > .Plus版
21 | > .Cool版
22 | > .Pro版
23 | > .Flip版
24 | 25 | #### 3.一句代码集成请放在AppDelegate中的window成为keyWindow之后即可。 26 | 27 | 注:您只需使用CoreLaunch的5 in 1合集其中任一一个即可。并且他们之前没有任何耦合性,完全可以单独使用。 28 | 29 | 30 |


31 | 使用示例 32 | ========== 33 | 34 |

35 | #### 1. Lite版 36 | 37 | /** Lite版本 */ 38 | [CoreLaunchLite animWithWindow:self.window image:nil]; 39 | 40 | ![image](https://github.com/CharlinFeng/Resource/blob/master/CoreLaunch/1.gif)

41 | 42 |

43 | #### 2. Plus版 44 | 45 | /** Plus版本 */ 46 | [CoreLaunchPlus animWithWindow:self.window image:nil]; 47 | 48 | ![image](https://github.com/CharlinFeng/Resource/blob/master/CoreLaunch/2.gif)

49 | 50 |

51 | #### 3.Cool版 52 | ##### 注:此效果为转场封装,默认效果为动画随机,方向随机,速率随机,您也可以到`CoreLaunchCool.m`自行配置您想要的效果。 53 | 54 | /** Cool版本 */ 55 | [CoreLaunchCool animWithWindow:self.window image:nil]; 56 | 57 | ![image](https://github.com/CharlinFeng/Resource/blob/master/CoreLaunch/3.gif)

58 | 59 |

60 | #### 4. Pro版 61 | 62 | ##### 注:本版本中使用了一个中间控制器ProVC,他涉及了比较复杂的循环引用,不过已经处理,您可以查看控制台他是会安全释放的。 63 | 64 | /** Pro版本 */ 65 | [CoreLaunchPro animWithWindow:self.window image:nil]; 66 | 67 | ![image](https://github.com/CharlinFeng/Resource/blob/master/CoreLaunch/4.gif)

68 | 69 |

70 | #### 5. Flip版 71 | 72 | ##### 注:本版本使用了各种延时不停的删除增加补充场景界面以实现效果,比较有趣。 73 | 74 | /** Flip版本 */ 75 | [CoreLaunchFlip animWithWindow:self.window image:nil]; 76 | 77 | ![image](https://github.com/CharlinFeng/Resource/blob/master/CoreLaunch/5.gif)

78 | 79 | 80 | #### 注:每个方法都可传image,这是一种长远考虑,涉及根控制器切换与版本新特性,当前您只需传nil即可。 81 | -------------------------------------------------------------------------------- /CoreLaunch/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "CoreLaunchLite.h" 11 | #import "CoreLaunchCool.h" 12 | #import "CoreLaunchPro.h" 13 | #import "CoreLaunchPlus.h" 14 | #import "CoreLaunchFlip.h" 15 | 16 | @interface AppDelegate () 17 | 18 | @end 19 | 20 | @implementation AppDelegate 21 | 22 | 23 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 24 | 25 | /** Lite版本 */ 26 | // [CoreLaunchLite animWithWindow:self.window image:nil]; 27 | 28 | /** Plus版本 */ 29 | // [CoreLaunchPlus animWithWindow:self.window image:nil]; 30 | 31 | /** Cool版本 */ 32 | // [CoreLaunchCool animWithWindow:self.window image:nil]; 33 | 34 | /** Pro版本 */ 35 | // [CoreLaunchPro animWithWindow:self.window image:nil]; 36 | 37 | /** Flip版本 */ 38 | [CoreLaunchFlip animWithWindow:self.window image:nil]; 39 | 40 | return YES; 41 | } 42 | 43 | - (void)applicationWillResignActive:(UIApplication *)application { 44 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 45 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 46 | } 47 | 48 | - (void)applicationDidEnterBackground:(UIApplication *)application { 49 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 50 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 51 | } 52 | 53 | - (void)applicationWillEnterForeground:(UIApplication *)application { 54 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 55 | } 56 | 57 | - (void)applicationDidBecomeActive:(UIApplication *)application { 58 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 59 | } 60 | 61 | - (void)applicationWillTerminate:(UIApplication *)application { 62 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 63 | } 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/CoreLaunchFlip.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreLaunchFlip.h" 10 | #import "UIView+JDFlipImageView.h" 11 | 12 | #define iphone4x_3_5 ([UIScreen mainScreen].bounds.size.height==480.0f) 13 | 14 | #define iphone5x_4_0 ([UIScreen mainScreen].bounds.size.height==568.0f) 15 | 16 | #define iphone6_4_7 ([UIScreen mainScreen].bounds.size.height==667.0f) 17 | 18 | #define iphone6Plus_5_5 ([UIScreen mainScreen].bounds.size.height==736.0f || [UIScreen mainScreen].bounds.size.height==414.0f) 19 | 20 | @implementation CoreLaunchFlip 21 | 22 | 23 | /** 执行动画 */ 24 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image{ 25 | 26 | UIView *view = window.rootViewController.view; 27 | 28 | 29 | UIImageView *imageV = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | 31 | imageV.image = image==nil?[self launchImage]:image; 32 | [view addSubview:imageV]; 33 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 34 | [imageV removeFromSuperview]; 35 | UIImage *image = [self cutFromView:view]; 36 | [view addSubview:imageV]; 37 | 38 | UIImageView *imageV2 = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 39 | imageV2.image = image; 40 | [view addSubview:imageV2]; 41 | [view addSubview:imageV]; 42 | 43 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 44 | [imageV flipToView:imageV2]; 45 | [imageV removeFromSuperview]; 46 | [imageV2 removeFromSuperview]; 47 | }); 48 | }); 49 | } 50 | 51 | 52 | 53 | 54 | /** 55 | * 获取启动图片 56 | */ 57 | +(UIImage *)launchImage{ 58 | 59 | NSString *imageName=@"LaunchImage-700"; 60 | 61 | if(iphone5x_4_0) imageName=@"LaunchImage-700-568h"; 62 | 63 | if(iphone6_4_7) imageName = @"LaunchImage-800-667h"; 64 | 65 | if(iphone6Plus_5_5) imageName = @"LaunchImage-800-Portrait-736h"; 66 | 67 | UIImage *image = [UIImage imageNamed:imageName]; 68 | 69 | NSAssert(image != nil, @"Charlin Feng提示您:请添加启动图片!"); 70 | 71 | return image; 72 | } 73 | 74 | +(UIImage *)cutFromView:(UIView *)view{ 75 | 76 | //开启图形上下文 77 | UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0f); 78 | 79 | //获取上下文 80 | CGContextRef context = UIGraphicsGetCurrentContext(); 81 | 82 | //在新建的图形上下文中渲染view的layer 83 | [view.layer renderInContext:context]; 84 | 85 | [[UIColor clearColor] setFill]; 86 | 87 | //获取图片 88 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 89 | 90 | //关闭图形上下文 91 | UIGraphicsEndImageContext(); 92 | 93 | return image; 94 | } 95 | 96 | @end 97 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchCool/CALayer+Cool.m: -------------------------------------------------------------------------------- 1 | // 2 | // CALayer+Transition.m 3 | // Carpenter 4 | // 5 | // Created by 冯成林 on 15/4/23. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CALayer+Cool.h" 10 | 11 | @implementation CALayer (Cool) 12 | 13 | 14 | /** 15 | * 转场动画 16 | * 17 | * @param animType 转场动画类型 18 | * @param subtype 转动动画方向 19 | * @param curve 转动动画曲线 20 | * @param duration 转动动画时长 21 | * 22 | * @return 转场动画实例 23 | */ 24 | -(CATransition *)transitionWithAnimType:(TransitionAnimType)animType subType:(TransitionSubType)subType curve:(TransitionCurve)curve duration:(CGFloat)duration{ 25 | 26 | NSString *key = @"transition"; 27 | 28 | if([self animationForKey:key]!=nil){ 29 | [self removeAnimationForKey:key]; 30 | } 31 | 32 | 33 | CATransition *transition=[CATransition animation]; 34 | 35 | //动画时长 36 | transition.duration=duration; 37 | 38 | //动画类型 39 | transition.type=[self animaTypeWithTransitionType:animType]; 40 | 41 | //动画方向 42 | transition.subtype=[self animaSubtype:subType]; 43 | 44 | //缓动函数 45 | transition.timingFunction=[CAMediaTimingFunction functionWithName:[self curve:curve]]; 46 | 47 | //完成动画删除 48 | transition.removedOnCompletion = YES; 49 | 50 | [self addAnimation:transition forKey:key]; 51 | 52 | return transition; 53 | } 54 | 55 | 56 | 57 | /* 58 | * 返回动画曲线 59 | */ 60 | -(NSString *)curve:(TransitionCurve)curve{ 61 | 62 | //曲线数组 63 | NSArray *funcNames=@[kCAMediaTimingFunctionDefault,kCAMediaTimingFunctionEaseIn,kCAMediaTimingFunctionEaseInEaseOut,kCAMediaTimingFunctionEaseOut,kCAMediaTimingFunctionLinear]; 64 | 65 | return [self objFromArray:funcNames index:curve isRamdom:(TransitionCurveRamdom == curve)]; 66 | } 67 | 68 | 69 | 70 | /* 71 | * 返回动画方向 72 | */ 73 | -(NSString *)animaSubtype:(TransitionSubType)subType{ 74 | 75 | //设置转场动画的方向 76 | NSArray *subtypes=@[kCATransitionFromTop,kCATransitionFromLeft,kCATransitionFromBottom,kCATransitionFromRight]; 77 | 78 | return [self objFromArray:subtypes index:subType isRamdom:(TransitionSubtypesFromRamdom == subType)]; 79 | } 80 | 81 | 82 | 83 | 84 | /* 85 | * 返回动画类型 86 | */ 87 | -(NSString *)animaTypeWithTransitionType:(TransitionAnimType)type{ 88 | 89 | //设置转场动画的类型 90 | NSArray *animArray=@[@"rippleEffect",@"suckEffect",@"pageCurl",@"oglFlip",@"cube",@"reveal",@"pageUnCurl",@"push"]; 91 | 92 | return [self objFromArray:animArray index:type isRamdom:(TransitionAnimTypeRamdom == type)]; 93 | } 94 | 95 | 96 | 97 | /* 98 | * 统一从数据返回对象 99 | */ 100 | -(id)objFromArray:(NSArray *)array index:(NSUInteger)index isRamdom:(BOOL)isRamdom{ 101 | 102 | NSUInteger count = array.count; 103 | 104 | NSUInteger i = isRamdom?arc4random_uniform((u_int32_t)count) : index; 105 | 106 | return array[i]; 107 | } 108 | 109 | 110 | 111 | @end 112 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPlus/CoreLaunchPlus.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreLaunchLite.m 3 | // CoreLaunch 4 | // 5 | // Created by 冯成林 on 15/10/16. 6 | // Copyright © 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreLaunchPlus.h" 10 | 11 | 12 | #define iphone4x_3_5 ([UIScreen mainScreen].bounds.size.height==480.0f) 13 | 14 | #define iphone5x_4_0 ([UIScreen mainScreen].bounds.size.height==568.0f) 15 | 16 | #define iphone6_4_7 ([UIScreen mainScreen].bounds.size.height==667.0f) 17 | 18 | #define iphone6Plus_5_5 ([UIScreen mainScreen].bounds.size.height==736.0f || [UIScreen mainScreen].bounds.size.height==414.0f) 19 | 20 | static const CGFloat duration = 1.5f; 21 | 22 | @implementation CoreLaunchPlus 23 | 24 | 25 | /** 执行动画 */ 26 | +(void)animWithWindow:(UIWindow *)window image:(UIImage *)image{ 27 | 28 | UIImageView *imageV = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 29 | 30 | imageV.image = image==nil?[self launchImage]:image; 31 | 32 | [window.rootViewController.view addSubview:imageV]; 33 | 34 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 35 | 36 | [self rotation:imageV.layer]; 37 | 38 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 39 | 40 | [imageV removeFromSuperview]; 41 | }); 42 | }); 43 | } 44 | 45 | 46 | 47 | 48 | /** 49 | * 获取启动图片 50 | */ 51 | +(UIImage *)launchImage{ 52 | 53 | NSString *imageName=@"LaunchImage-700"; 54 | 55 | if(iphone5x_4_0) imageName=@"LaunchImage-700-568h"; 56 | 57 | if(iphone6_4_7) imageName = @"LaunchImage-800-667h"; 58 | 59 | if(iphone6Plus_5_5) imageName = @"LaunchImage-800-Portrait-736h"; 60 | 61 | UIImage *image = [UIImage imageNamed:imageName]; 62 | 63 | NSAssert(image != nil, @"Charlin Feng提示您:请添加启动图片!"); 64 | 65 | return image; 66 | } 67 | 68 | 69 | +(void)rotation:(CALayer *)layer{ 70 | 71 | //创建普通动画 72 | CABasicAnimation *rotationAnim = [CABasicAnimation animationWithKeyPath:[NSString stringWithFormat:@"transform.rotation.z"]]; 73 | 74 | //动画曲线 75 | rotationAnim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 76 | 77 | //起点值 78 | rotationAnim.fromValue=@(0); 79 | 80 | //终点值 81 | rotationAnim.toValue = @(M_PI_2); 82 | 83 | //时长 84 | rotationAnim.duration = duration; 85 | 86 | //自动反转 87 | rotationAnim.autoreverses = NO; 88 | 89 | //完成删除 90 | rotationAnim.removedOnCompletion = YES; 91 | 92 | //重复次数 93 | rotationAnim.repeatCount = 0; 94 | 95 | //向前填充 96 | rotationAnim.fillMode=kCAFillModeForwards; 97 | 98 | //动画完成不删除 99 | rotationAnim.removedOnCompletion = NO; 100 | 101 | //锚点 102 | layer.anchorPoint = CGPointMake(0, 1); 103 | layer.position=CGPointMake(0, layer.bounds.size.height); 104 | 105 | //添加 106 | [layer addAnimation:rotationAnim forKey:@"rotationAnim"]; 107 | } 108 | 109 | 110 | 111 | @end 112 | -------------------------------------------------------------------------------- /CoreLaunch.xcodeproj/xcuserdata/Charlin.xcuserdatad/xcschemes/CoreLaunch.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/Lib/JDFlipNumberViewImageFactory.m: -------------------------------------------------------------------------------- 1 | // 2 | // JDFlipNumberViewImageFactory.m 3 | // FlipNumberViewExample 4 | // 5 | // Created by Markus Emrich on 05.12.12. 6 | // Copyright (c) 2012 markusemrich. All rights reserved. 7 | // 8 | 9 | #import "JDFlipNumberViewImageFactory.h" 10 | 11 | @interface JDFlipNumberViewImageFactory () 12 | @property (nonatomic, strong) NSMutableDictionary *topImages; 13 | @property (nonatomic, strong) NSMutableDictionary *bottomImages; 14 | @end 15 | 16 | @implementation JDFlipNumberViewImageFactory 17 | 18 | + (instancetype)sharedInstance; 19 | { 20 | static JDFlipNumberViewImageFactory *_sharedInstance; 21 | static dispatch_once_t onceToken; 22 | dispatch_once(&onceToken, ^{ 23 | _sharedInstance = [[self alloc] init]; 24 | }); 25 | 26 | return _sharedInstance; 27 | } 28 | 29 | - (id)init 30 | { 31 | self = [super init]; 32 | if (self) { 33 | _topImages = [NSMutableDictionary dictionary]; 34 | _bottomImages = [NSMutableDictionary dictionary]; 35 | 36 | // register for memory warnings 37 | [[NSNotificationCenter defaultCenter] 38 | addObserver:self selector:@selector(didReceiveMemoryWarning:) 39 | name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 40 | } 41 | return self; 42 | } 43 | 44 | #pragma mark - 45 | #pragma mark getter 46 | 47 | - (NSArray *)topImagesForBundleNamed:(NSString *)bundleName; 48 | { 49 | if ([_topImages[bundleName] count] == 0) { 50 | [self generateImagesFromBundleNamed:bundleName]; 51 | } 52 | 53 | return _topImages[bundleName]; 54 | } 55 | 56 | - (NSArray *)bottomImagesForBundleNamed:(NSString *)bundleName; 57 | { 58 | if ([_bottomImages[bundleName] count] == 0) { 59 | [self generateImagesFromBundleNamed:bundleName]; 60 | } 61 | 62 | return _bottomImages[bundleName]; 63 | } 64 | 65 | - (CGSize)imageSizeForBundleNamed:(NSString *)bundleName; 66 | { 67 | NSArray *images = self.topImages[bundleName]; 68 | if (images.count > 0) { 69 | return [images[0] size]; 70 | } 71 | return CGSizeZero; 72 | } 73 | 74 | #pragma mark - 75 | #pragma mark image generation 76 | 77 | - (void)generateImagesFromBundleNamed:(NSString*)bundleName; 78 | { 79 | // create image array 80 | NSMutableArray* topImages = [NSMutableArray arrayWithCapacity:10]; 81 | NSMutableArray* bottomImages = [NSMutableArray arrayWithCapacity:10]; 82 | 83 | // append .bundle to name 84 | NSString *filename = bundleName; 85 | if (![filename hasSuffix:@".bundle"]) filename = [NSString stringWithFormat: @"%@.bundle", filename]; 86 | NSString *bundlePath = [[NSBundle mainBundle] pathForResource:filename ofType:nil]; 87 | NSAssert(bundlePath != nil, @"Bundle named '%@' not found!", filename); 88 | if (!bundlePath) return; 89 | 90 | // create bottom and top images 91 | for (NSInteger digit=0; digit<10; digit++) 92 | { 93 | // create path & image 94 | NSString *imageName = [NSString stringWithFormat: @"%ld.png", (long)digit]; 95 | NSString *bundleImageName = [NSString stringWithFormat: @"%@/%@", filename, imageName]; 96 | NSString *path = [[NSBundle mainBundle] pathForResource:bundleImageName ofType:nil]; 97 | UIImage *sourceImage = [[UIImage alloc] initWithContentsOfFile:path]; 98 | NSAssert(sourceImage != nil, @"Did not find image '%@' in bundle named '%@'", imageName, filename); 99 | 100 | // generate & save images 101 | NSArray *images = [self generateImagesFromImage:sourceImage]; 102 | [topImages addObject:images[0]]; 103 | [bottomImages addObject:images[1]]; 104 | } 105 | 106 | // save images 107 | self.topImages[bundleName] = [NSArray arrayWithArray:topImages]; 108 | self.bottomImages[bundleName] = [NSArray arrayWithArray:bottomImages]; 109 | } 110 | 111 | - (NSArray*)generateImagesFromImage:(UIImage*)image; 112 | { 113 | NSMutableArray *images = [NSMutableArray array]; 114 | 115 | for (int i=0; i<2; i++) { 116 | CGSize size = CGSizeMake(image.size.width, image.size.height/2); 117 | CGFloat yPoint = (i==0) ? 0 : -size.height; 118 | 119 | // draw half of the image in a new image 120 | UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale); 121 | [image drawAtPoint:CGPointMake(0,yPoint)]; 122 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 123 | UIGraphicsEndImageContext(); 124 | 125 | // save image 126 | [images addObject:image]; 127 | } 128 | 129 | return images; 130 | } 131 | 132 | #pragma mark - 133 | #pragma mark memory 134 | 135 | - (void)didReceiveMemoryWarning:(NSNotification*)notification; 136 | { 137 | // remove all saved images 138 | _topImages = [NSMutableDictionary dictionary]; 139 | _bottomImages = [NSMutableDictionary dictionary]; 140 | } 141 | 142 | @end 143 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/Lib/UIView+JDFlipImageView.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+JDFlipImageView.m 3 | // FlipNumberViewExample 4 | // 5 | // Created by Markus on 19.11.13. 6 | // Copyright (c) 2013 markusemrich. All rights reserved. 7 | // 8 | 9 | #import "UIView+JDFlipImageView.h" 10 | #import 11 | 12 | @interface UIView (JDFlipImageViewHidden) 13 | - (UIImage*)imageSnapshotAfterScreenUpdates:(BOOL)afterScreenUpdates; 14 | - (JDFlipImageView*)addFlipViewWithAnimationFromImage:(UIImage*)fromImage 15 | toImage:(UIImage*)toImage 16 | duration:(NSTimeInterval)duration 17 | direction:(JDFlipImageViewFlipDirection)direction 18 | completion:(JDFlipImageViewCompletionBlock)completion; 19 | @end 20 | 21 | @implementation UIView (JDFlipImageView) 22 | 23 | #pragma mark Flip transition to another view 24 | 25 | - (void)flipToView:(UIView*)view; 26 | { 27 | [self flipToView:view duration:JDFlipImageViewDefaultFlipDuration removeView:YES 28 | direction:JDFlipImageViewFlipDirectionDown completion:nil]; 29 | } 30 | 31 | - (void)flipToView:(UIView*)view 32 | completion:(JDFlipImageViewCompletionBlock)completion; 33 | { 34 | [self flipToView:view duration:JDFlipImageViewDefaultFlipDuration removeView:YES 35 | direction:JDFlipImageViewFlipDirectionDown completion:completion]; 36 | } 37 | 38 | - (void)flipToView:(UIView*)view 39 | duration:(CGFloat)duration 40 | completion:(JDFlipImageViewCompletionBlock)completion; 41 | { 42 | [self flipToView:view duration:duration removeView:YES 43 | direction:JDFlipImageViewFlipDirectionDown completion:completion]; 44 | } 45 | 46 | - (void)flipToView:(UIView*)view 47 | duration:(CGFloat)duration 48 | direction:(JDFlipImageViewFlipDirection)direction 49 | completion:(JDFlipImageViewCompletionBlock)completion; 50 | { 51 | [self flipToView:view duration:duration removeView:YES 52 | direction:direction completion:completion]; 53 | } 54 | 55 | - (void)flipToView:(UIView*)view 56 | duration:(CGFloat)duration 57 | removeView:(BOOL)removeFromSuperView 58 | direction:(JDFlipImageViewFlipDirection)direction 59 | completion:(JDFlipImageViewCompletionBlock)completion; 60 | { 61 | // screenshots 62 | UIImage *oldImage = [self imageSnapshotAfterScreenUpdates:NO]; 63 | UIImage *newImage = [view imageSnapshotAfterScreenUpdates:YES]; 64 | 65 | // add new view 66 | [self.superview insertSubview:view belowSubview:self]; 67 | view.frame = self.frame; 68 | 69 | // create & add flipview 70 | [self addFlipViewWithAnimationFromImage:oldImage toImage:newImage 71 | duration:duration direction:direction 72 | completion:completion]; 73 | 74 | // remove old view 75 | if (removeFromSuperView) { 76 | [self removeFromSuperview]; 77 | } 78 | } 79 | 80 | #pragma mark View updates using a flip animation 81 | 82 | - (void)updateWithFlipAnimationUpdates:(JDFlipImageViewViewUpdateBlock)updates; 83 | { 84 | [self updateWithFlipAnimationDuration:JDFlipImageViewDefaultFlipDuration 85 | direction:JDFlipImageViewFlipDirectionDown 86 | updates:updates completion:nil]; 87 | } 88 | 89 | - (void)updateWithFlipAnimationUpdates:(JDFlipImageViewViewUpdateBlock)updates 90 | completion:(JDFlipImageViewCompletionBlock)completion; 91 | { 92 | [self updateWithFlipAnimationDuration:JDFlipImageViewDefaultFlipDuration 93 | direction:JDFlipImageViewFlipDirectionDown 94 | updates:updates completion:completion]; 95 | } 96 | 97 | - (void)updateWithFlipAnimationDuration:(CGFloat)duration 98 | updates:(JDFlipImageViewViewUpdateBlock)updates 99 | completion:(JDFlipImageViewCompletionBlock)completion; 100 | { 101 | [self updateWithFlipAnimationDuration:duration 102 | direction:JDFlipImageViewFlipDirectionDown 103 | updates:updates completion:completion]; 104 | } 105 | 106 | - (void)updateWithFlipAnimationDuration:(CGFloat)duration 107 | direction:(JDFlipImageViewFlipDirection)direction 108 | updates:(JDFlipImageViewViewUpdateBlock)updates 109 | completion:(JDFlipImageViewCompletionBlock)completion; 110 | { 111 | // screenshots & updates 112 | UIImage *oldImage = [self imageSnapshotAfterScreenUpdates:NO]; 113 | if (updates) updates(); 114 | UIImage *newImage = [self imageSnapshotAfterScreenUpdates:YES]; 115 | 116 | // create & add flipview 117 | [self addFlipViewWithAnimationFromImage:oldImage toImage:newImage 118 | duration:duration direction:direction 119 | completion:completion]; 120 | } 121 | 122 | #pragma mark Reused Code 123 | 124 | - (UIImage*)imageSnapshotAfterScreenUpdates:(BOOL)afterScreenUpdates; 125 | { 126 | CGSize size = self.bounds.size; 127 | UIGraphicsBeginImageContextWithOptions(size, NO, 0); 128 | 129 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // only when SDK is >= ios7 130 | if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { 131 | [self drawViewHierarchyInRect:(CGRect){CGPointZero, size} afterScreenUpdates:afterScreenUpdates]; 132 | } else { 133 | [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 134 | } 135 | #else 136 | [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 137 | #endif 138 | 139 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 140 | UIGraphicsEndImageContext(); 141 | return image; 142 | } 143 | 144 | - (JDFlipImageView*)addFlipViewWithAnimationFromImage:(UIImage*)fromImage 145 | toImage:(UIImage*)toImage 146 | duration:(NSTimeInterval)duration 147 | direction:(JDFlipImageViewFlipDirection)direction 148 | completion:(JDFlipImageViewCompletionBlock)completion; 149 | { 150 | NSParameterAssert(fromImage); 151 | NSParameterAssert(toImage); 152 | if (!fromImage || !toImage) return nil; 153 | 154 | // create & add flipview 155 | JDFlipImageView *flipImageView = [[JDFlipImageView alloc] initWithImage:fromImage]; 156 | flipImageView.frame = self.frame; 157 | flipImageView.flipDirection = direction; 158 | [self.superview insertSubview:flipImageView aboveSubview:self]; 159 | 160 | // hide actual view while animating (for transculent views) 161 | self.hidden = YES; 162 | 163 | // animate 164 | __weak typeof(self) blockSelf = self; 165 | __weak typeof(flipImageView) blockFlipImageView = flipImageView; 166 | [flipImageView setImageAnimated:toImage duration:duration completion:^(BOOL finished) { 167 | [blockFlipImageView removeFromSuperview]; 168 | // show view again 169 | blockSelf.hidden = NO; 170 | 171 | // call completion 172 | if (completion) { 173 | completion(finished); 174 | } 175 | }]; 176 | 177 | return flipImageView; 178 | } 179 | 180 | @end 181 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchPro/PortalTransition/CYPortalTransitionAnimator.m: -------------------------------------------------------------------------------- 1 | // 2 | // CYPortalTransition.m 3 | // PortalTransitionExample 4 | // 5 | // Created by Ce Yang on 23/05/2015. 6 | // Copyright (c) 2015 Ce Yang. All rights reserved. 7 | // 8 | 9 | #import "CYPortalTransitionAnimator.h" 10 | 11 | @implementation CYPortalTransitionAnimator 12 | 13 | -(instancetype)init{ 14 | if (self = [super init]) { 15 | [self setup]; 16 | } 17 | return self; 18 | } 19 | 20 | - (void)setup{ 21 | _reflectionGap = 10.0f; 22 | _reflectionScale = 0.f; 23 | _reflectionAlpha = 0.5f; 24 | _targetViewScale = 0.1f; 25 | _portalAnimationDuration = 1.6f; 26 | _scaleAnimationDuration = 1.6f; 27 | _delay = 0.5f; 28 | } 29 | 30 | - (UIImageView *)setupReflectionViewWithReferenceView: (UIView *)toView { 31 | CGRect frame = toView.bounds; 32 | frame.size.height = frame.size.height / 2; 33 | UIImageView *reflectionView = [[UIImageView alloc] initWithFrame:frame]; 34 | reflectionView.userInteractionEnabled = NO; 35 | 36 | CGSize reflectionViewSize = CGSizeMake(toView.bounds.size.width, toView.bounds.size.height * _reflectionScale); 37 | if (reflectionViewSize.width > 0 && reflectionViewSize.height > 0) { 38 | UIGraphicsBeginImageContextWithOptions(reflectionViewSize, YES, 0.0f); 39 | CGContextRef gradientContext = UIGraphicsGetCurrentContext(); 40 | CGFloat colors[] = {1.0f ,1.0f, 0.0f, 1.0f}; 41 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 42 | 43 | CGGradientRef gradient =CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2); 44 | CGPoint gradientStartPoint = CGPointMake(0.0f,0.0f); 45 | CGPoint gradientEndPoint = CGPointMake(0.0f, reflectionViewSize.height); 46 | CGContextDrawLinearGradient(gradientContext, gradient, gradientStartPoint, gradientEndPoint,kCGGradientDrawsAfterEndLocation); 47 | CGImageRef gradientMask = CGBitmapContextCreateImage(gradientContext); 48 | CGGradientRelease(gradient); 49 | CGColorSpaceRelease(colorSpace); 50 | UIGraphicsEndImageContext(); 51 | 52 | UIGraphicsBeginImageContextWithOptions(reflectionViewSize, NO, 0.0f); 53 | CGContextRef context = UIGraphicsGetCurrentContext(); 54 | CGContextScaleCTM(context, 1.0f, -1.0f); 55 | CGContextTranslateCTM(context, 0.0f, -toView.bounds.size.height); 56 | 57 | CGContextClipToMask(context, CGRectMake(0.0f, toView.bounds.size.height - reflectionViewSize.height, reflectionViewSize.width, reflectionViewSize.height), gradientMask); 58 | CGImageRelease(gradientMask); 59 | 60 | [toView.layer renderInContext:context]; 61 | 62 | reflectionView.image = UIGraphicsGetImageFromCurrentImageContext(); 63 | UIGraphicsEndImageContext(); 64 | } 65 | 66 | return reflectionView; 67 | } 68 | 69 | - (NSTimeInterval)transitionDuration:(id )transitionContext; 70 | { 71 | return MAX(_portalAnimationDuration, _scaleAnimationDuration); 72 | } 73 | 74 | - (void)animateTransition:(id )transitionContext; 75 | { 76 | UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 77 | UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 78 | 79 | UIView *fromView = fromViewController.view; 80 | UIView *toView = toViewController.view; 81 | 82 | CGSize fromViewSize = fromView.bounds.size; 83 | 84 | /** 85 | * FromView and portal animation 86 | */ 87 | // Take a screenshot, take screen scale into consideration 88 | CGFloat screenScale = [UIScreen mainScreen].scale; 89 | if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 90 | UIGraphicsBeginImageContextWithOptions(fromView.window.bounds.size, NO, screenScale); 91 | else 92 | UIGraphicsBeginImageContext(fromView.window.bounds.size); 93 | 94 | [fromView.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 95 | UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext(); 96 | UIGraphicsEndImageContext(); 97 | // Seperate image into 2 door side 98 | CGRect clippedLeftRect = CGRectMake(0, 0, screenImage.size.width / 2 * screenScale, screenImage.size.height * screenScale); 99 | CGRect clippedRightRect = CGRectMake(screenImage.size.width/2 * screenScale, 0, screenImage.size.width / 2 * screenScale, screenImage.size.height * screenScale); 100 | CGRect clippedLeftRectBis = CGRectMake(0, 0, screenImage.size.width/2, screenImage.size.height); 101 | CGRect clippedRightRectBis = CGRectMake(screenImage.size.width/2, 0, screenImage.size.width/2, screenImage.size.height); 102 | CGImageRef leftImageRef = CGImageCreateWithImageInRect(screenImage.CGImage, clippedLeftRect); 103 | CGImageRef rightImageRef = CGImageCreateWithImageInRect(screenImage.CGImage, clippedRightRect); 104 | UIImage *leftImage = [UIImage imageWithCGImage:leftImageRef]; 105 | UIImage *rightImage = [UIImage imageWithCGImage:rightImageRef]; 106 | CGImageRelease(leftImageRef); 107 | CGImageRelease(rightImageRef); 108 | 109 | // Add 2 image views 110 | UIImageView *leftImageView = [[UIImageView alloc] initWithFrame:clippedLeftRectBis]; 111 | UIImageView *rightImageView = [[UIImageView alloc] initWithFrame:clippedRightRectBis]; 112 | leftImageView.image = leftImage; 113 | rightImageView.image = rightImage; 114 | 115 | //Add left and right doorside over fromView so that it will not be covered by fromView 116 | [fromView.superview addSubview:leftImageView]; 117 | [fromView.superview addSubview:rightImageView]; 118 | 119 | leftImageView.layer.anchorPoint = CGPointMake(0, 0.5); 120 | leftImageView.layer.position = CGPointMake(0, leftImageView.frame.size.height/2); 121 | 122 | rightImageView.layer.anchorPoint = CGPointMake(1, 0.5); 123 | rightImageView.layer.position = CGPointMake(rightImageView.frame.size.width * 2, rightImageView.frame.size.height/2); 124 | 125 | //Add Transform for rotate along Y Axis 126 | CATransform3D leftScaleTransform = CATransform3DScale(CATransform3DIdentity, 2, 2, 1); 127 | CATransform3D rightScaleTransform = CATransform3DScale(CATransform3DIdentity, 2, 2, 1); 128 | CATransform3D leftRotateTransform = CATransform3DRotate(leftScaleTransform,M_PI/2, 0, 1, 0); 129 | CATransform3D rightRotateTransform = CATransform3DRotate(rightScaleTransform,-M_PI/2, 0, 1, 0); 130 | 131 | CATransform3D leftTranslate = CATransform3DTranslate(leftRotateTransform, -fromViewSize.width,0,0); 132 | CATransform3D rightTranslate = CATransform3DTranslate(rightRotateTransform, fromViewSize.width,0,0); 133 | 134 | CAAnimation *leftAnimation = [self getAnimationWithToValue:leftTranslate]; 135 | [leftImageView.layer addAnimation:leftAnimation forKey:@"transform"]; 136 | 137 | CAAnimation *transfomationRight = [self getAnimationWithToValue:rightTranslate]; 138 | [rightImageView.layer addAnimation:transfomationRight forKey:@"transform"]; 139 | 140 | /** 141 | * toView and reflectionView animation 142 | */ 143 | UIImageView *reflectionView = [self setupReflectionViewWithReferenceView:toView]; 144 | //Add all the views related to transition to container View 145 | [[transitionContext containerView] addSubview:toView]; 146 | [[transitionContext containerView] addSubview:reflectionView]; 147 | 148 | //Apply scale for toView and its reflection 149 | toView.transform = CGAffineTransformMakeScale(_targetViewScale,_targetViewScale); 150 | reflectionView.transform = CGAffineTransformMakeScale(_targetViewScale, _targetViewScale); 151 | 152 | //Adjust reflectionView frame 153 | CGRect reflectionViewFrame = reflectionView.frame; 154 | reflectionViewFrame.origin.y = CGRectGetMaxY(toView.frame) + _reflectionGap; 155 | reflectionView.frame = reflectionViewFrame; 156 | 157 | toView.alpha = 0.4; 158 | reflectionView.alpha = 0.4; 159 | fromView.hidden = YES; 160 | 161 | [UIView animateWithDuration:_scaleAnimationDuration delay:_delay options:UIViewAnimationOptionCurveEaseInOut animations:^{ 162 | toView.alpha = 1; 163 | reflectionView.alpha = 1; 164 | reflectionView.transform = CGAffineTransformMakeScale(1, 1); 165 | toView.transform = CGAffineTransformMakeScale(1, 1); 166 | leftImageView.alpha = 0.4; 167 | rightImageView.alpha = 0.4; 168 | leftImageView.layer.position = CGPointMake(-200.f, leftImageView.frame.size.height/2); 169 | rightImageView.layer.position = CGPointMake(200.f + 2 * rightImageView.frame.size.width, rightImageView.frame.size.height/2); 170 | 171 | reflectionView.frame = CGRectMake(0, fromViewSize.height + _reflectionGap, fromViewSize.width, fromViewSize.height/2); 172 | 173 | if (_portalTransitionStyle == CYPortalTransitionStylePush) { 174 | // Push view controller to navigation view controller stack 175 | // In animation block so that nav bar will take final state into consideration thus create a smooth animation 176 | NSMutableArray *currentViewControllerStack = [NSMutableArray arrayWithArray:fromViewController.navigationController.viewControllers]; 177 | [currentViewControllerStack addObject:toViewController]; 178 | fromViewController.navigationController.viewControllers = currentViewControllerStack; 179 | } 180 | 181 | } completion:^(BOOL finished) { 182 | //Remove left right imageview and reflection 183 | [leftImageView removeFromSuperview]; 184 | [rightImageView removeFromSuperview]; 185 | [reflectionView removeFromSuperview]; 186 | fromView.hidden = NO; 187 | 188 | if (_portalTransitionStyle == CYPortalTransitionStylePresent) { 189 | // Call native presentViewController to apply the view hierachy change 190 | [fromViewController presentViewController:toViewController animated:NO completion:nil]; 191 | } 192 | 193 | [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 194 | }]; 195 | 196 | } 197 | 198 | - (CAAnimation *)getAnimationWithToValue:(CATransform3D)transform { 199 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 200 | animation.toValue = [NSValue valueWithCATransform3D:transform]; 201 | animation.duration = _portalAnimationDuration; 202 | animation.fillMode = kCAFillModeForwards; 203 | animation.removedOnCompletion = NO; 204 | animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 205 | return animation; 206 | } 207 | 208 | 209 | @end 210 | -------------------------------------------------------------------------------- /CoreLaunch/CoreLaunch/CoreLaunchFlip/Lib/JDFlipImageView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JDFlipImageView.m 3 | // FlipNumberViewExample 4 | // 5 | // Created by Markus Emrich on 16.11.13. 6 | // Copyright (c) 2013 markusemrich. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "JDFlipNumberViewImageFactory.h" 11 | 12 | #import "JDFlipImageView.h" 13 | 14 | const NSTimeInterval JDFlipImageViewDefaultFlipDuration = 1.6; 15 | static NSString *const JDFlipImageAnimationKey = @"JDFlipImageAnimationKey"; 16 | 17 | typedef NS_OPTIONS(NSUInteger, JDFlipAnimationState) { 18 | JDFlipAnimationStateFirstHalf, 19 | JDFlipAnimationStateSecondHalf 20 | }; 21 | 22 | @interface JDFlipImageView () 23 | 24 | @property (nonatomic, assign) BOOL upscalingAllowed; 25 | @property (nonatomic, assign) CGFloat animationDuration; 26 | @property (nonatomic, assign) JDFlipAnimationState animationState; 27 | @property (nonatomic, strong) NSArray *nextImages; 28 | 29 | @property (nonatomic, strong) UIImageView *topImageView; 30 | @property (nonatomic, strong) UIImageView *flipImageView; 31 | @property (nonatomic, strong) UIImageView *bottomImageView; 32 | 33 | 34 | @property (nonatomic, copy) JDFlipImageViewCompletionBlock completionBlock; 35 | 36 | @end 37 | 38 | 39 | @implementation JDFlipImageView 40 | 41 | - (id)initWithFrame:(CGRect)frame; 42 | { 43 | self = [super initWithFrame:frame]; 44 | if (self) { 45 | // setup view 46 | self.backgroundColor = [UIColor clearColor]; 47 | self.autoresizesSubviews = NO; 48 | 49 | // default values 50 | _animationState = JDFlipAnimationStateFirstHalf; 51 | 52 | // images & frame 53 | [self initImagesAndFrames]; 54 | } 55 | return self; 56 | } 57 | 58 | - (id)initWithImage:(UIImage *)image; 59 | { 60 | self = [self initWithFrame:(CGRect){CGPointZero, image.size}]; 61 | if (self) { 62 | self.image = image; 63 | } 64 | return self; 65 | } 66 | 67 | - (void)initImagesAndFrames; 68 | { 69 | // setup image views 70 | self.topImageView = [[UIImageView alloc] init]; 71 | self.flipImageView = [[UIImageView alloc] init]; 72 | self.bottomImageView = [[UIImageView alloc] init]; 73 | 74 | // setup frames 75 | CGSize size = self.bounds.size; 76 | self.topImageView.frame = (CGRect){CGPointZero, {size.width, size.height/2.0}}; 77 | self.bottomImageView.frame = (CGRect){{0, size.height/2.0}, {size.width, size.height/2.0}}; 78 | self.flipImageView.frame = (CGRect){CGPointZero, {size.width, size.height/2.0}}; 79 | 80 | // set z positions 81 | self.topImageView.layer.zPosition = -1; 82 | self.bottomImageView.layer.zPosition = -1; 83 | self.flipImageView.layer.zPosition = 0; 84 | 85 | // add image views 86 | [self addSubview:self.topImageView]; 87 | [self addSubview:self.bottomImageView]; 88 | [self addSubview:self.flipImageView]; 89 | 90 | // hide flipview 91 | self.flipImageView.hidden = YES; 92 | } 93 | 94 | #pragma mark - 95 | #pragma mark layout 96 | 97 | - (CGSize)sizeThatFits:(CGSize)aSize; 98 | { 99 | if (!self.topImageView.image) return aSize; 100 | 101 | CGSize imageSize = self.topImageView.image.size; 102 | 103 | CGFloat ratioW = aSize.width/aSize.height; 104 | CGFloat origRatioW = imageSize.width/(imageSize.height*2); 105 | CGFloat origRatioH = (imageSize.height*2)/imageSize.width; 106 | 107 | if (ratioW>origRatioW) { 108 | aSize.width = aSize.height*origRatioW; 109 | } else { 110 | aSize.height = aSize.width*origRatioH; 111 | } 112 | 113 | if (!self.upscalingAllowed) { 114 | aSize = [self sizeWithMaximumSize:aSize]; 115 | } 116 | 117 | return aSize; 118 | } 119 | 120 | - (CGSize)sizeWithMaximumSize:(CGSize)size; 121 | { 122 | if (!self.topImageView.image) return size; 123 | 124 | CGSize imageSize = self.topImageView.image.size; 125 | 126 | size.width = MIN(size.width, imageSize.width); 127 | size.height = MIN(size.height, imageSize.height*2); 128 | return size; 129 | } 130 | 131 | - (void)setFrame:(CGRect)rect; 132 | { 133 | rect.size = [self sizeThatFits:rect.size]; 134 | [super setFrame:rect]; 135 | 136 | // update imageView frames 137 | rect.origin = CGPointMake(0, 0); 138 | rect.size.height /= 2.0; 139 | self.topImageView.frame = rect; 140 | rect.origin.y += rect.size.height; 141 | self.bottomImageView.frame = rect; 142 | 143 | // update flip imageView frame 144 | [self updateFlipViewFrame]; 145 | 146 | // reset Z distance 147 | [self setZDistance:self.frame.size.height*3]; 148 | } 149 | 150 | - (void)setZDistance:(NSUInteger)zDistance; 151 | { 152 | _zDistance = zDistance; 153 | 154 | // setup 3d transform 155 | CATransform3D aTransform = CATransform3DIdentity; 156 | aTransform.m34 = -1.0 / zDistance; 157 | self.layer.sublayerTransform = aTransform; 158 | } 159 | 160 | #pragma mark value setter 161 | 162 | - (void)setImage:(UIImage *)image; 163 | { 164 | _image = image; 165 | if (!image) return; 166 | 167 | self.nextImages = [[JDFlipNumberViewImageFactory sharedInstance] 168 | generateImagesFromImage:image]; 169 | 170 | self.topImageView.image = self.nextImages[0]; 171 | self.bottomImageView.image = self.nextImages[1]; 172 | } 173 | 174 | - (void)setImageAnimated:(UIImage*)image; 175 | { 176 | [self setImageAnimated:image 177 | duration:JDFlipImageViewFlipDirectionDown 178 | completion:nil]; 179 | } 180 | 181 | - (void)setImageAnimated:(UIImage*)image 182 | completion:(JDFlipImageViewCompletionBlock)completion; 183 | { 184 | [self setImageAnimated:image 185 | duration:JDFlipImageViewFlipDirectionDown 186 | completion:completion]; 187 | } 188 | 189 | - (void)setImageAnimated:(UIImage*)image 190 | duration:(CGFloat)duration 191 | completion:(JDFlipImageViewCompletionBlock)completion; 192 | { 193 | _image = image; 194 | if (!image) return; 195 | 196 | // update current images (in case animation isnt finished) 197 | self.topImageView.image = self.nextImages[0]; 198 | self.bottomImageView.image = self.nextImages[1]; 199 | 200 | // remove any running animation 201 | [self.flipImageView.layer removeAnimationForKey:JDFlipImageAnimationKey]; 202 | 203 | // set animation parameter 204 | self.animationDuration = duration; 205 | self.completionBlock = completion; 206 | self.animationState = JDFlipAnimationStateFirstHalf; 207 | self.nextImages = [[JDFlipNumberViewImageFactory sharedInstance] 208 | generateImagesFromImage:image]; 209 | 210 | // animate 211 | [self runAnimation]; 212 | } 213 | 214 | #pragma mark - 215 | #pragma mark animation 216 | 217 | - (void)runAnimation; 218 | { 219 | [self updateFlipViewFrame]; 220 | 221 | BOOL isTopDown = (self.flipDirection == JDFlipImageViewFlipDirectionDown); 222 | 223 | // setup animation 224 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 225 | animation.duration = self.animationDuration/2.0; 226 | animation.delegate = self; 227 | animation.removedOnCompletion = NO; 228 | animation.fillMode = kCAFillModeForwards; 229 | 230 | // exchange images & setup animation 231 | if (self.animationState == JDFlipAnimationStateFirstHalf) { 232 | // remove any old animations 233 | [self.flipImageView.layer removeAllAnimations]; 234 | 235 | // setup first animation half 236 | self.flipImageView.image = isTopDown ? self.topImageView.image : self.bottomImageView.image; 237 | self.topImageView.image = isTopDown ? self.nextImages[0] : self.topImageView.image; 238 | self.bottomImageView.image = isTopDown ? self.bottomImageView.image : self.nextImages[1]; 239 | 240 | animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0, 1, 0, 0)]; 241 | animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(isTopDown ? -M_PI_2 : M_PI_2, 1, 0, 0)]; 242 | animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 243 | } else { 244 | // setup second animation half 245 | self.flipImageView.image = isTopDown ? self.nextImages[1] : self.nextImages[0]; 246 | 247 | animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(isTopDown ? M_PI_2 : -M_PI_2, 1, 0, 0)]; 248 | animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0, 1, 0, 0)]; 249 | animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 250 | } 251 | 252 | // add/start animation 253 | [self.flipImageView.layer addAnimation:animation forKey:JDFlipImageAnimationKey]; 254 | 255 | // show animated view 256 | self.flipImageView.hidden = NO; 257 | } 258 | 259 | - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)finished 260 | { 261 | if (!finished) { 262 | if (self.completionBlock) { 263 | JDFlipImageViewCompletionBlock block = self.completionBlock; 264 | self.completionBlock = nil; 265 | block(NO); 266 | } 267 | return; 268 | } 269 | 270 | if (self.animationState == JDFlipAnimationStateFirstHalf) { 271 | // do second animation step 272 | self.animationState = JDFlipAnimationStateSecondHalf; 273 | [self runAnimation]; 274 | } else { 275 | // reset state 276 | self.animationState = JDFlipAnimationStateFirstHalf; 277 | 278 | // update images 279 | BOOL isTopDown = (self.flipDirection == JDFlipImageViewFlipDirectionDown); 280 | if (isTopDown) { 281 | self.bottomImageView.image = self.flipImageView.image; 282 | } else { 283 | self.topImageView.image = self.flipImageView.image; 284 | } 285 | 286 | // remove old animation 287 | [self.flipImageView.layer removeAnimationForKey:JDFlipImageAnimationKey]; 288 | 289 | // hide animated view 290 | self.flipImageView.hidden = YES; 291 | 292 | // call completion block 293 | if (self.completionBlock) { 294 | JDFlipImageViewCompletionBlock block = self.completionBlock; 295 | self.completionBlock = nil; 296 | block(YES); 297 | } 298 | } 299 | } 300 | 301 | - (void)updateFlipViewFrame; 302 | { 303 | BOOL isTopDown = (self.flipDirection == JDFlipImageViewFlipDirectionDown); 304 | if ((isTopDown && self.animationState == JDFlipAnimationStateFirstHalf) || 305 | (!isTopDown && self.animationState == JDFlipAnimationStateSecondHalf)) { 306 | self.flipImageView.layer.anchorPoint = CGPointMake(0.5, 1.0); 307 | self.flipImageView.frame = self.topImageView.frame; 308 | } else { 309 | self.flipImageView.layer.anchorPoint = CGPointMake(0.5, 0.0); 310 | self.flipImageView.frame = self.bottomImageView.frame; 311 | } 312 | } 313 | 314 | @end 315 | -------------------------------------------------------------------------------- /CoreLaunch/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 65 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 111 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /CoreLaunch.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 8919AF951BD088A80068A38E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AF941BD088A80068A38E /* main.m */; }; 11 | 8919AF981BD088A80068A38E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AF971BD088A80068A38E /* AppDelegate.m */; }; 12 | 8919AF9B1BD088A80068A38E /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AF9A1BD088A80068A38E /* ViewController.m */; }; 13 | 8919AF9E1BD088A80068A38E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8919AF9C1BD088A80068A38E /* Main.storyboard */; }; 14 | 8919AFA01BD088A80068A38E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8919AF9F1BD088A80068A38E /* Assets.xcassets */; }; 15 | 8919AFA31BD088A80068A38E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8919AFA11BD088A80068A38E /* LaunchScreen.storyboard */; }; 16 | 8919AFAE1BD08CB40068A38E /* CoreLaunchLite.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AFAD1BD08CB40068A38E /* CoreLaunchLite.m */; settings = {ASSET_TAGS = (); }; }; 17 | 8919AFB21BD096BC0068A38E /* CoreLaunchCool.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AFB11BD096BC0068A38E /* CoreLaunchCool.m */; settings = {ASSET_TAGS = (); }; }; 18 | 8919AFB51BD0972A0068A38E /* CALayer+Cool.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AFB41BD0972A0068A38E /* CALayer+Cool.m */; settings = {ASSET_TAGS = (); }; }; 19 | 8919AFB91BD0A0DD0068A38E /* CoreLaunchPro.m in Sources */ = {isa = PBXBuildFile; fileRef = 8919AFB81BD0A0DD0068A38E /* CoreLaunchPro.m */; settings = {ASSET_TAGS = (); }; }; 20 | 8953C46E1BDF6159000066BF /* CoreLaunchFlip.m in Sources */ = {isa = PBXBuildFile; fileRef = 8953C4661BDF6159000066BF /* CoreLaunchFlip.m */; settings = {ASSET_TAGS = (); }; }; 21 | 8953C46F1BDF6159000066BF /* JDFlipImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8953C4691BDF6159000066BF /* JDFlipImageView.m */; settings = {ASSET_TAGS = (); }; }; 22 | 8953C4701BDF6159000066BF /* JDFlipNumberViewImageFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 8953C46B1BDF6159000066BF /* JDFlipNumberViewImageFactory.m */; settings = {ASSET_TAGS = (); }; }; 23 | 8953C4711BDF6159000066BF /* UIView+JDFlipImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8953C46D1BDF6159000066BF /* UIView+JDFlipImageView.m */; settings = {ASSET_TAGS = (); }; }; 24 | 89581F2F1BD0C44C00A8ED5F /* CoreLaunchPlus.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F2E1BD0C44C00A8ED5F /* CoreLaunchPlus.m */; settings = {ASSET_TAGS = (); }; }; 25 | 89581F401BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F351BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.m */; settings = {ASSET_TAGS = (); }; }; 26 | 89581F411BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F371BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.m */; settings = {ASSET_TAGS = (); }; }; 27 | 89581F421BD0C9CA00A8ED5F /* CYPortalTransitionContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F391BD0C9CA00A8ED5F /* CYPortalTransitionContext.m */; settings = {ASSET_TAGS = (); }; }; 28 | 89581F431BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F3B1BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.m */; settings = {ASSET_TAGS = (); }; }; 29 | 89581F441BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F3D1BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.m */; settings = {ASSET_TAGS = (); }; }; 30 | 89581F451BD0C9CA00A8ED5F /* UIViewController+PortalTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F3F1BD0C9CA00A8ED5F /* UIViewController+PortalTransition.m */; settings = {ASSET_TAGS = (); }; }; 31 | 89581F481BD0CB5400A8ED5F /* ProVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 89581F471BD0CB5400A8ED5F /* ProVC.m */; settings = {ASSET_TAGS = (); }; }; 32 | /* End PBXBuildFile section */ 33 | 34 | /* Begin PBXFileReference section */ 35 | 8919AF901BD088A80068A38E /* CoreLaunch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CoreLaunch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 8919AF941BD088A80068A38E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 37 | 8919AF961BD088A80068A38E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 38 | 8919AF971BD088A80068A38E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 39 | 8919AF991BD088A80068A38E /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 40 | 8919AF9A1BD088A80068A38E /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 41 | 8919AF9D1BD088A80068A38E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 8919AF9F1BD088A80068A38E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 8919AFA21BD088A80068A38E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 8919AFA41BD088A80068A38E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | 8919AFAC1BD08CB40068A38E /* CoreLaunchLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreLaunchLite.h; sourceTree = ""; }; 46 | 8919AFAD1BD08CB40068A38E /* CoreLaunchLite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreLaunchLite.m; sourceTree = ""; }; 47 | 8919AFB01BD096BC0068A38E /* CoreLaunchCool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreLaunchCool.h; sourceTree = ""; }; 48 | 8919AFB11BD096BC0068A38E /* CoreLaunchCool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreLaunchCool.m; sourceTree = ""; }; 49 | 8919AFB31BD0972A0068A38E /* CALayer+Cool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CALayer+Cool.h"; sourceTree = ""; }; 50 | 8919AFB41BD0972A0068A38E /* CALayer+Cool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CALayer+Cool.m"; sourceTree = ""; }; 51 | 8919AFB71BD0A0DD0068A38E /* CoreLaunchPro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreLaunchPro.h; sourceTree = ""; }; 52 | 8919AFB81BD0A0DD0068A38E /* CoreLaunchPro.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreLaunchPro.m; sourceTree = ""; }; 53 | 8953C4651BDF6159000066BF /* CoreLaunchFlip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreLaunchFlip.h; sourceTree = ""; }; 54 | 8953C4661BDF6159000066BF /* CoreLaunchFlip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreLaunchFlip.m; sourceTree = ""; }; 55 | 8953C4681BDF6159000066BF /* JDFlipImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JDFlipImageView.h; sourceTree = ""; }; 56 | 8953C4691BDF6159000066BF /* JDFlipImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JDFlipImageView.m; sourceTree = ""; }; 57 | 8953C46A1BDF6159000066BF /* JDFlipNumberViewImageFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JDFlipNumberViewImageFactory.h; sourceTree = ""; }; 58 | 8953C46B1BDF6159000066BF /* JDFlipNumberViewImageFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JDFlipNumberViewImageFactory.m; sourceTree = ""; }; 59 | 8953C46C1BDF6159000066BF /* UIView+JDFlipImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+JDFlipImageView.h"; sourceTree = ""; }; 60 | 8953C46D1BDF6159000066BF /* UIView+JDFlipImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+JDFlipImageView.m"; sourceTree = ""; }; 61 | 89581F2D1BD0C44C00A8ED5F /* CoreLaunchPlus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreLaunchPlus.h; sourceTree = ""; }; 62 | 89581F2E1BD0C44C00A8ED5F /* CoreLaunchPlus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreLaunchPlus.m; sourceTree = ""; }; 63 | 89581F341BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CYNavigationControllerDelegate.h; sourceTree = ""; }; 64 | 89581F351BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CYNavigationControllerDelegate.m; sourceTree = ""; }; 65 | 89581F361BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CYPortalTransitionAnimator.h; sourceTree = ""; }; 66 | 89581F371BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CYPortalTransitionAnimator.m; sourceTree = ""; }; 67 | 89581F381BD0C9CA00A8ED5F /* CYPortalTransitionContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CYPortalTransitionContext.h; sourceTree = ""; }; 68 | 89581F391BD0C9CA00A8ED5F /* CYPortalTransitionContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CYPortalTransitionContext.m; sourceTree = ""; }; 69 | 89581F3A1BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CYViewControllerTransitioningDelegate.h; sourceTree = ""; }; 70 | 89581F3B1BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CYViewControllerTransitioningDelegate.m; sourceTree = ""; }; 71 | 89581F3C1BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+PortalTransition.h"; sourceTree = ""; }; 72 | 89581F3D1BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+PortalTransition.m"; sourceTree = ""; }; 73 | 89581F3E1BD0C9CA00A8ED5F /* UIViewController+PortalTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+PortalTransition.h"; sourceTree = ""; }; 74 | 89581F3F1BD0C9CA00A8ED5F /* UIViewController+PortalTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+PortalTransition.m"; sourceTree = ""; }; 75 | 89581F461BD0CB5400A8ED5F /* ProVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProVC.h; sourceTree = ""; }; 76 | 89581F471BD0CB5400A8ED5F /* ProVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProVC.m; sourceTree = ""; }; 77 | /* End PBXFileReference section */ 78 | 79 | /* Begin PBXFrameworksBuildPhase section */ 80 | 8919AF8D1BD088A80068A38E /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | /* End PBXFrameworksBuildPhase section */ 88 | 89 | /* Begin PBXGroup section */ 90 | 8919AF871BD088A80068A38E = { 91 | isa = PBXGroup; 92 | children = ( 93 | 8919AF921BD088A80068A38E /* CoreLaunch */, 94 | 8919AF911BD088A80068A38E /* Products */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | 8919AF911BD088A80068A38E /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 8919AF901BD088A80068A38E /* CoreLaunch.app */, 102 | ); 103 | name = Products; 104 | sourceTree = ""; 105 | }; 106 | 8919AF921BD088A80068A38E /* CoreLaunch */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 8919AFAA1BD088DC0068A38E /* CoreLaunch */, 110 | 8919AF961BD088A80068A38E /* AppDelegate.h */, 111 | 8919AF971BD088A80068A38E /* AppDelegate.m */, 112 | 8919AF991BD088A80068A38E /* ViewController.h */, 113 | 8919AF9A1BD088A80068A38E /* ViewController.m */, 114 | 8919AF9C1BD088A80068A38E /* Main.storyboard */, 115 | 8919AF9F1BD088A80068A38E /* Assets.xcassets */, 116 | 8919AFA11BD088A80068A38E /* LaunchScreen.storyboard */, 117 | 8919AFA41BD088A80068A38E /* Info.plist */, 118 | 8919AF931BD088A80068A38E /* Supporting Files */, 119 | ); 120 | path = CoreLaunch; 121 | sourceTree = ""; 122 | }; 123 | 8919AF931BD088A80068A38E /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 8919AF941BD088A80068A38E /* main.m */, 127 | ); 128 | name = "Supporting Files"; 129 | sourceTree = ""; 130 | }; 131 | 8919AFAA1BD088DC0068A38E /* CoreLaunch */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 8953C4641BDF6159000066BF /* CoreLaunchFlip */, 135 | 89581F2C1BD0C44C00A8ED5F /* CoreLaunchPlus */, 136 | 8919AFB61BD0A0DD0068A38E /* CoreLaunchPro */, 137 | 8919AFAF1BD096B10068A38E /* CoreLaunchCool */, 138 | 8919AFAB1BD088DC0068A38E /* CoreLaunchLite */, 139 | ); 140 | path = CoreLaunch; 141 | sourceTree = ""; 142 | }; 143 | 8919AFAB1BD088DC0068A38E /* CoreLaunchLite */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 8919AFAC1BD08CB40068A38E /* CoreLaunchLite.h */, 147 | 8919AFAD1BD08CB40068A38E /* CoreLaunchLite.m */, 148 | ); 149 | path = CoreLaunchLite; 150 | sourceTree = ""; 151 | }; 152 | 8919AFAF1BD096B10068A38E /* CoreLaunchCool */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | 8919AFB01BD096BC0068A38E /* CoreLaunchCool.h */, 156 | 8919AFB11BD096BC0068A38E /* CoreLaunchCool.m */, 157 | 8919AFB31BD0972A0068A38E /* CALayer+Cool.h */, 158 | 8919AFB41BD0972A0068A38E /* CALayer+Cool.m */, 159 | ); 160 | path = CoreLaunchCool; 161 | sourceTree = ""; 162 | }; 163 | 8919AFB61BD0A0DD0068A38E /* CoreLaunchPro */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 89581F331BD0C9CA00A8ED5F /* PortalTransition */, 167 | 8919AFB71BD0A0DD0068A38E /* CoreLaunchPro.h */, 168 | 8919AFB81BD0A0DD0068A38E /* CoreLaunchPro.m */, 169 | 89581F461BD0CB5400A8ED5F /* ProVC.h */, 170 | 89581F471BD0CB5400A8ED5F /* ProVC.m */, 171 | ); 172 | path = CoreLaunchPro; 173 | sourceTree = ""; 174 | }; 175 | 8953C4641BDF6159000066BF /* CoreLaunchFlip */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | 8953C4651BDF6159000066BF /* CoreLaunchFlip.h */, 179 | 8953C4661BDF6159000066BF /* CoreLaunchFlip.m */, 180 | 8953C4671BDF6159000066BF /* Lib */, 181 | ); 182 | path = CoreLaunchFlip; 183 | sourceTree = ""; 184 | }; 185 | 8953C4671BDF6159000066BF /* Lib */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | 8953C4681BDF6159000066BF /* JDFlipImageView.h */, 189 | 8953C4691BDF6159000066BF /* JDFlipImageView.m */, 190 | 8953C46A1BDF6159000066BF /* JDFlipNumberViewImageFactory.h */, 191 | 8953C46B1BDF6159000066BF /* JDFlipNumberViewImageFactory.m */, 192 | 8953C46C1BDF6159000066BF /* UIView+JDFlipImageView.h */, 193 | 8953C46D1BDF6159000066BF /* UIView+JDFlipImageView.m */, 194 | ); 195 | path = Lib; 196 | sourceTree = ""; 197 | }; 198 | 89581F2C1BD0C44C00A8ED5F /* CoreLaunchPlus */ = { 199 | isa = PBXGroup; 200 | children = ( 201 | 89581F2D1BD0C44C00A8ED5F /* CoreLaunchPlus.h */, 202 | 89581F2E1BD0C44C00A8ED5F /* CoreLaunchPlus.m */, 203 | ); 204 | path = CoreLaunchPlus; 205 | sourceTree = ""; 206 | }; 207 | 89581F331BD0C9CA00A8ED5F /* PortalTransition */ = { 208 | isa = PBXGroup; 209 | children = ( 210 | 89581F341BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.h */, 211 | 89581F351BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.m */, 212 | 89581F361BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.h */, 213 | 89581F371BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.m */, 214 | 89581F381BD0C9CA00A8ED5F /* CYPortalTransitionContext.h */, 215 | 89581F391BD0C9CA00A8ED5F /* CYPortalTransitionContext.m */, 216 | 89581F3A1BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.h */, 217 | 89581F3B1BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.m */, 218 | 89581F3C1BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.h */, 219 | 89581F3D1BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.m */, 220 | 89581F3E1BD0C9CA00A8ED5F /* UIViewController+PortalTransition.h */, 221 | 89581F3F1BD0C9CA00A8ED5F /* UIViewController+PortalTransition.m */, 222 | ); 223 | path = PortalTransition; 224 | sourceTree = ""; 225 | }; 226 | /* End PBXGroup section */ 227 | 228 | /* Begin PBXNativeTarget section */ 229 | 8919AF8F1BD088A80068A38E /* CoreLaunch */ = { 230 | isa = PBXNativeTarget; 231 | buildConfigurationList = 8919AFA71BD088A80068A38E /* Build configuration list for PBXNativeTarget "CoreLaunch" */; 232 | buildPhases = ( 233 | 8919AF8C1BD088A80068A38E /* Sources */, 234 | 8919AF8D1BD088A80068A38E /* Frameworks */, 235 | 8919AF8E1BD088A80068A38E /* Resources */, 236 | ); 237 | buildRules = ( 238 | ); 239 | dependencies = ( 240 | ); 241 | name = CoreLaunch; 242 | productName = CoreLaunch; 243 | productReference = 8919AF901BD088A80068A38E /* CoreLaunch.app */; 244 | productType = "com.apple.product-type.application"; 245 | }; 246 | /* End PBXNativeTarget section */ 247 | 248 | /* Begin PBXProject section */ 249 | 8919AF881BD088A80068A38E /* Project object */ = { 250 | isa = PBXProject; 251 | attributes = { 252 | LastUpgradeCheck = 0700; 253 | ORGANIZATIONNAME = "冯成林"; 254 | TargetAttributes = { 255 | 8919AF8F1BD088A80068A38E = { 256 | CreatedOnToolsVersion = 7.0; 257 | }; 258 | }; 259 | }; 260 | buildConfigurationList = 8919AF8B1BD088A80068A38E /* Build configuration list for PBXProject "CoreLaunch" */; 261 | compatibilityVersion = "Xcode 3.2"; 262 | developmentRegion = English; 263 | hasScannedForEncodings = 0; 264 | knownRegions = ( 265 | en, 266 | Base, 267 | ); 268 | mainGroup = 8919AF871BD088A80068A38E; 269 | productRefGroup = 8919AF911BD088A80068A38E /* Products */; 270 | projectDirPath = ""; 271 | projectRoot = ""; 272 | targets = ( 273 | 8919AF8F1BD088A80068A38E /* CoreLaunch */, 274 | ); 275 | }; 276 | /* End PBXProject section */ 277 | 278 | /* Begin PBXResourcesBuildPhase section */ 279 | 8919AF8E1BD088A80068A38E /* Resources */ = { 280 | isa = PBXResourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | 8919AFA31BD088A80068A38E /* LaunchScreen.storyboard in Resources */, 284 | 8919AFA01BD088A80068A38E /* Assets.xcassets in Resources */, 285 | 8919AF9E1BD088A80068A38E /* Main.storyboard in Resources */, 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | }; 289 | /* End PBXResourcesBuildPhase section */ 290 | 291 | /* Begin PBXSourcesBuildPhase section */ 292 | 8919AF8C1BD088A80068A38E /* Sources */ = { 293 | isa = PBXSourcesBuildPhase; 294 | buildActionMask = 2147483647; 295 | files = ( 296 | 8919AF9B1BD088A80068A38E /* ViewController.m in Sources */, 297 | 89581F431BD0C9CA00A8ED5F /* CYViewControllerTransitioningDelegate.m in Sources */, 298 | 89581F441BD0C9CA00A8ED5F /* UINavigationController+PortalTransition.m in Sources */, 299 | 89581F2F1BD0C44C00A8ED5F /* CoreLaunchPlus.m in Sources */, 300 | 8919AFB91BD0A0DD0068A38E /* CoreLaunchPro.m in Sources */, 301 | 89581F421BD0C9CA00A8ED5F /* CYPortalTransitionContext.m in Sources */, 302 | 8919AFAE1BD08CB40068A38E /* CoreLaunchLite.m in Sources */, 303 | 89581F401BD0C9CA00A8ED5F /* CYNavigationControllerDelegate.m in Sources */, 304 | 8953C46F1BDF6159000066BF /* JDFlipImageView.m in Sources */, 305 | 8953C46E1BDF6159000066BF /* CoreLaunchFlip.m in Sources */, 306 | 8953C4711BDF6159000066BF /* UIView+JDFlipImageView.m in Sources */, 307 | 89581F411BD0C9CA00A8ED5F /* CYPortalTransitionAnimator.m in Sources */, 308 | 89581F481BD0CB5400A8ED5F /* ProVC.m in Sources */, 309 | 89581F451BD0C9CA00A8ED5F /* UIViewController+PortalTransition.m in Sources */, 310 | 8919AF981BD088A80068A38E /* AppDelegate.m in Sources */, 311 | 8919AF951BD088A80068A38E /* main.m in Sources */, 312 | 8919AFB51BD0972A0068A38E /* CALayer+Cool.m in Sources */, 313 | 8919AFB21BD096BC0068A38E /* CoreLaunchCool.m in Sources */, 314 | 8953C4701BDF6159000066BF /* JDFlipNumberViewImageFactory.m in Sources */, 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | }; 318 | /* End PBXSourcesBuildPhase section */ 319 | 320 | /* Begin PBXVariantGroup section */ 321 | 8919AF9C1BD088A80068A38E /* Main.storyboard */ = { 322 | isa = PBXVariantGroup; 323 | children = ( 324 | 8919AF9D1BD088A80068A38E /* Base */, 325 | ); 326 | name = Main.storyboard; 327 | sourceTree = ""; 328 | }; 329 | 8919AFA11BD088A80068A38E /* LaunchScreen.storyboard */ = { 330 | isa = PBXVariantGroup; 331 | children = ( 332 | 8919AFA21BD088A80068A38E /* Base */, 333 | ); 334 | name = LaunchScreen.storyboard; 335 | sourceTree = ""; 336 | }; 337 | /* End PBXVariantGroup section */ 338 | 339 | /* Begin XCBuildConfiguration section */ 340 | 8919AFA51BD088A80068A38E /* Debug */ = { 341 | isa = XCBuildConfiguration; 342 | buildSettings = { 343 | ALWAYS_SEARCH_USER_PATHS = NO; 344 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 345 | CLANG_CXX_LIBRARY = "libc++"; 346 | CLANG_ENABLE_MODULES = YES; 347 | CLANG_ENABLE_OBJC_ARC = YES; 348 | CLANG_WARN_BOOL_CONVERSION = YES; 349 | CLANG_WARN_CONSTANT_CONVERSION = YES; 350 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 351 | CLANG_WARN_EMPTY_BODY = YES; 352 | CLANG_WARN_ENUM_CONVERSION = YES; 353 | CLANG_WARN_INT_CONVERSION = YES; 354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 355 | CLANG_WARN_UNREACHABLE_CODE = YES; 356 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 357 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 358 | COPY_PHASE_STRIP = NO; 359 | DEBUG_INFORMATION_FORMAT = dwarf; 360 | ENABLE_STRICT_OBJC_MSGSEND = YES; 361 | ENABLE_TESTABILITY = YES; 362 | GCC_C_LANGUAGE_STANDARD = gnu99; 363 | GCC_DYNAMIC_NO_PIC = NO; 364 | GCC_NO_COMMON_BLOCKS = YES; 365 | GCC_OPTIMIZATION_LEVEL = 0; 366 | GCC_PREPROCESSOR_DEFINITIONS = ( 367 | "DEBUG=1", 368 | "$(inherited)", 369 | ); 370 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 371 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 372 | GCC_WARN_UNDECLARED_SELECTOR = YES; 373 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 374 | GCC_WARN_UNUSED_FUNCTION = YES; 375 | GCC_WARN_UNUSED_VARIABLE = YES; 376 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 377 | MTL_ENABLE_DEBUG_INFO = YES; 378 | ONLY_ACTIVE_ARCH = YES; 379 | SDKROOT = iphoneos; 380 | }; 381 | name = Debug; 382 | }; 383 | 8919AFA61BD088A80068A38E /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | buildSettings = { 386 | ALWAYS_SEARCH_USER_PATHS = NO; 387 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 388 | CLANG_CXX_LIBRARY = "libc++"; 389 | CLANG_ENABLE_MODULES = YES; 390 | CLANG_ENABLE_OBJC_ARC = YES; 391 | CLANG_WARN_BOOL_CONVERSION = YES; 392 | CLANG_WARN_CONSTANT_CONVERSION = YES; 393 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 394 | CLANG_WARN_EMPTY_BODY = YES; 395 | CLANG_WARN_ENUM_CONVERSION = YES; 396 | CLANG_WARN_INT_CONVERSION = YES; 397 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 398 | CLANG_WARN_UNREACHABLE_CODE = YES; 399 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 400 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 401 | COPY_PHASE_STRIP = NO; 402 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 403 | ENABLE_NS_ASSERTIONS = NO; 404 | ENABLE_STRICT_OBJC_MSGSEND = YES; 405 | GCC_C_LANGUAGE_STANDARD = gnu99; 406 | GCC_NO_COMMON_BLOCKS = YES; 407 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 408 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 409 | GCC_WARN_UNDECLARED_SELECTOR = YES; 410 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 411 | GCC_WARN_UNUSED_FUNCTION = YES; 412 | GCC_WARN_UNUSED_VARIABLE = YES; 413 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 414 | MTL_ENABLE_DEBUG_INFO = NO; 415 | SDKROOT = iphoneos; 416 | VALIDATE_PRODUCT = YES; 417 | }; 418 | name = Release; 419 | }; 420 | 8919AFA81BD088A80068A38E /* Debug */ = { 421 | isa = XCBuildConfiguration; 422 | buildSettings = { 423 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 424 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 425 | INFOPLIST_FILE = CoreLaunch/Info.plist; 426 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 427 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 428 | PRODUCT_BUNDLE_IDENTIFIER = cn.Charlin.CoreLaunch; 429 | PRODUCT_NAME = "$(TARGET_NAME)"; 430 | }; 431 | name = Debug; 432 | }; 433 | 8919AFA91BD088A80068A38E /* Release */ = { 434 | isa = XCBuildConfiguration; 435 | buildSettings = { 436 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 437 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 438 | INFOPLIST_FILE = CoreLaunch/Info.plist; 439 | IPHONEOS_DEPLOYMENT_TARGET = 7.1; 440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 441 | PRODUCT_BUNDLE_IDENTIFIER = cn.Charlin.CoreLaunch; 442 | PRODUCT_NAME = "$(TARGET_NAME)"; 443 | }; 444 | name = Release; 445 | }; 446 | /* End XCBuildConfiguration section */ 447 | 448 | /* Begin XCConfigurationList section */ 449 | 8919AF8B1BD088A80068A38E /* Build configuration list for PBXProject "CoreLaunch" */ = { 450 | isa = XCConfigurationList; 451 | buildConfigurations = ( 452 | 8919AFA51BD088A80068A38E /* Debug */, 453 | 8919AFA61BD088A80068A38E /* Release */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | 8919AFA71BD088A80068A38E /* Build configuration list for PBXNativeTarget "CoreLaunch" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 8919AFA81BD088A80068A38E /* Debug */, 462 | 8919AFA91BD088A80068A38E /* Release */, 463 | ); 464 | defaultConfigurationIsVisible = 0; 465 | defaultConfigurationName = Release; 466 | }; 467 | /* End XCConfigurationList section */ 468 | }; 469 | rootObject = 8919AF881BD088A80068A38E /* Project object */; 470 | } 471 | --------------------------------------------------------------------------------