├── 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 | 
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 | 
41 |
42 |
43 | #### 2. Plus版
44 |
45 | /** Plus版本 */
46 | [CoreLaunchPlus animWithWindow:self.window image:nil];
47 |
48 | 
49 |
50 |
51 | #### 3.Cool版
52 | ##### 注:此效果为转场封装,默认效果为动画随机,方向随机,速率随机,您也可以到`CoreLaunchCool.m`自行配置您想要的效果。
53 |
54 | /** Cool版本 */
55 | [CoreLaunchCool animWithWindow:self.window image:nil];
56 |
57 | 
58 |
59 |
60 | #### 4. Pro版
61 |
62 | ##### 注:本版本中使用了一个中间控制器ProVC,他涉及了比较复杂的循环引用,不过已经处理,您可以查看控制台他是会安全释放的。
63 |
64 | /** Pro版本 */
65 | [CoreLaunchPro animWithWindow:self.window image:nil];
66 |
67 | 
68 |
69 |
70 | #### 5. Flip版
71 |
72 | ##### 注:本版本使用了各种延时不停的删除增加补充场景界面以实现效果,比较有趣。
73 |
74 | /** Flip版本 */
75 | [CoreLaunchFlip animWithWindow:self.window image:nil];
76 |
77 | 
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 |
--------------------------------------------------------------------------------