├── Login.gif
├── login.jpg
├── background.jpg
├── LoginTransition.xcodeproj
├── xcuserdata
│ └── fanyingzhao.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── LoginTransition.xcscheme
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── fanyingzhao.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
└── project.pbxproj
├── LoginTransition
├── ViewController.h
├── SecondViewController.h
├── AppDelegate.h
├── main.m
├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── SecondViewController.m
├── Info.plist
├── ViewController.m
├── AppDelegate.m
├── Base.lproj
│ ├── LaunchScreen.xib
│ └── Main.storyboard
└── SecondViewController.xib
├── FYLoginTranslation.h
├── LoginTransitionTests
├── Info.plist
└── LoginTransitionTests.m
├── README.md
└── FYLoginTranslation.m
/Login.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanyingzhao/LoginTransition/HEAD/Login.gif
--------------------------------------------------------------------------------
/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanyingzhao/LoginTransition/HEAD/login.jpg
--------------------------------------------------------------------------------
/background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanyingzhao/LoginTransition/HEAD/background.jpg
--------------------------------------------------------------------------------
/LoginTransition.xcodeproj/xcuserdata/fanyingzhao.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/LoginTransition.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/LoginTransition.xcodeproj/project.xcworkspace/xcuserdata/fanyingzhao.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanyingzhao/LoginTransition/HEAD/LoginTransition.xcodeproj/project.xcworkspace/xcuserdata/fanyingzhao.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/LoginTransition/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : UIViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/LoginTransition/SecondViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // SecondViewController.h
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface SecondViewController : UIViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/LoginTransition/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. 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 |
--------------------------------------------------------------------------------
/LoginTransition/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. 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 |
--------------------------------------------------------------------------------
/FYLoginTranslation.h:
--------------------------------------------------------------------------------
1 | //
2 | // FYLoginTranslation.h
3 | // 登陆转场
4 | //
5 | // Created by fanyingzhao on 15/5/20.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface FYLoginTranslation : NSObject
13 |
14 | @property (assign, nonatomic) BOOL reverse;
15 |
16 | - (instancetype)initWithView:(UIView*)btnView;
17 | - (void)stopAnimation;
18 | @end
19 |
--------------------------------------------------------------------------------
/LoginTransition.xcodeproj/xcuserdata/fanyingzhao.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | LoginTransition.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | D1B1A3EA1B2138EB00CC6C3B
16 |
17 | primary
18 |
19 |
20 | D1B1A4031B2138EB00CC6C3B
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/LoginTransition/Images.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 | }
--------------------------------------------------------------------------------
/LoginTransitionTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | fyz.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LoginTransition
2 | LoginTransitionAnimation
3 |
4 | #登陆时的按钮动画转场.
5 |
6 | 
7 |
8 |
9 | ###使用方式
10 | ``` objc
11 |
12 | // 初始化
13 | self.translation = [[FYLoginTranslation alloc] initWithView:self.btn];
14 |
15 | // 结束转场
16 | [self.translation stopAnimation];
17 |
18 | - (id)animationControllerForDismissedController:(UIViewController *)dismissed
19 | {
20 | self.translation.reverse = YES;
21 | return self.translation;
22 | }
23 |
24 | - (id)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
25 | {
26 | self.translation.reverse = NO;
27 | return self.translation;
28 | }
29 | ```
30 |
--------------------------------------------------------------------------------
/LoginTransitionTests/LoginTransitionTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // LoginTransitionTests.m
3 | // LoginTransitionTests
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface LoginTransitionTests : XCTestCase
13 |
14 | @end
15 |
16 | @implementation LoginTransitionTests
17 |
18 | - (void)setUp {
19 | [super setUp];
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 | }
22 |
23 | - (void)tearDown {
24 | // Put teardown code here. This method is called after the invocation of each test method in the class.
25 | [super tearDown];
26 | }
27 |
28 | - (void)testExample {
29 | // This is an example of a functional test case.
30 | XCTAssert(YES, @"Pass");
31 | }
32 |
33 | - (void)testPerformanceExample {
34 | // This is an example of a performance test case.
35 | [self measureBlock:^{
36 | // Put the code you want to measure the time of here.
37 | }];
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/LoginTransition/SecondViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // SecondViewController.m
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import "SecondViewController.h"
10 |
11 | @interface SecondViewController ()
12 |
13 | @end
14 |
15 | @implementation SecondViewController
16 |
17 | - (void)viewDidLoad {
18 | [super viewDidLoad];
19 | // Do any additional setup after loading the view from its nib.
20 | }
21 |
22 | - (void)didReceiveMemoryWarning {
23 | [super didReceiveMemoryWarning];
24 | // Dispose of any resources that can be recreated.
25 | }
26 |
27 | /*
28 | #pragma mark - Navigation
29 |
30 | // In a storyboard-based application, you will often want to do a little preparation before navigation
31 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
32 | // Get the new view controller using [segue destinationViewController].
33 | // Pass the selected object to the new view controller.
34 | }
35 | */
36 | - (IBAction)pressBtn:(id)sender
37 | {
38 | [self dismissViewControllerAnimated:YES completion:nil];
39 | }
40 |
41 | @end
42 |
--------------------------------------------------------------------------------
/LoginTransition/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | fyz.$(PRODUCT_NAME:rfc1034identifier)
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 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/LoginTransition/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "FYLoginTranslation.h"
11 | #import "SecondViewController.h"
12 |
13 | @interface ViewController ()
14 | @property (weak, nonatomic) IBOutlet UIButton* btn;
15 | @property (strong, nonatomic) FYLoginTranslation* login;
16 | @end
17 |
18 | @implementation ViewController
19 |
20 | - (void)viewDidLoad {
21 | [super viewDidLoad];
22 | // Do any additional setup after loading the view, typically from a nib.
23 |
24 | }
25 |
26 | - (void)finishTransition
27 | {
28 | [self.login stopAnimation];
29 | }
30 |
31 | - (void)didReceiveMemoryWarning {
32 | [super didReceiveMemoryWarning];
33 | // Dispose of any resources that can be recreated.
34 | }
35 |
36 | - (IBAction)pressBtn:(id)sender
37 | {
38 | SecondViewController* secondVC = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
39 | secondVC.transitioningDelegate = self;
40 | [self presentViewController:secondVC animated:YES completion:nil];
41 |
42 | [self performSelector:@selector(finishTransition) withObject:nil afterDelay:2];
43 | }
44 |
45 | - (FYLoginTranslation *)login
46 | {
47 | if (!_login) {
48 | _login = [[FYLoginTranslation alloc] initWithView:self.btn];
49 | }
50 | return _login;
51 | }
52 |
53 | #pragma mark UIViewControllerTransitioningDelegate
54 | - (id)animationControllerForDismissedController:(UIViewController *)dismissed
55 | {
56 | self.login.reverse = YES;
57 | return self.login;
58 | }
59 |
60 | - (id)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
61 | {
62 | self.login.reverse = NO;
63 | return self.login;
64 | }
65 | @end
66 |
--------------------------------------------------------------------------------
/LoginTransition/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // LoginTransition
4 | //
5 | // Created by fanyingzhao on 15/6/5.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
19 | // Override point for customization after application launch.
20 | return YES;
21 | }
22 |
23 | - (void)applicationWillResignActive:(UIApplication *)application {
24 | // 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.
25 | // 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.
26 | }
27 |
28 | - (void)applicationDidEnterBackground:(UIApplication *)application {
29 | // 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.
30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
31 | }
32 |
33 | - (void)applicationWillEnterForeground:(UIApplication *)application {
34 | // 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.
35 | }
36 |
37 | - (void)applicationDidBecomeActive:(UIApplication *)application {
38 | // 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.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application {
42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
43 | }
44 |
45 | @end
46 |
--------------------------------------------------------------------------------
/LoginTransition/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
20 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/LoginTransition/SecondViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/LoginTransition.xcodeproj/xcuserdata/fanyingzhao.xcuserdatad/xcschemes/LoginTransition.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
75 |
77 |
83 |
84 |
85 |
86 |
87 |
88 |
94 |
96 |
102 |
103 |
104 |
105 |
107 |
108 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/LoginTransition/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 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/FYLoginTranslation.m:
--------------------------------------------------------------------------------
1 | //
2 | // FYLoginTranslation.m
3 | // 登陆转场
4 | //
5 | // Created by fanyingzhao on 15/5/20.
6 | // Copyright (c) 2015年 fanyingzhao. All rights reserved.
7 | //
8 |
9 | #import "FYLoginTranslation.h"
10 |
11 | @interface FYLoginTranslation ()
12 | @property (strong, nonatomic) UIView* btnView;
13 | @property (assign, nonatomic) CGRect originRect;
14 | @property (strong ,nonatomic) UIView* animationView;
15 |
16 | @property (assign, nonatomic) id context;
17 | @property (strong, nonatomic) UIView* containerView;
18 | @property (assign, nonatomic) CGFloat radius;
19 | @property (strong, nonatomic) CAShapeLayer* shapeLayer;
20 | @end
21 |
22 | #define kRotationAnimation @"RotationAnimation"
23 | @implementation FYLoginTranslation
24 |
25 | - (instancetype)initWithView:(UIView *)btnView
26 | {
27 | if (self = [super init]) {
28 |
29 | NSAssert(btnView, @"btnView 不能为空");
30 | _btnView = btnView;
31 | _originRect = btnView.frame;
32 | }
33 | return self;
34 | }
35 |
36 | - (NSTimeInterval)transitionDuration:(id)transitionContext
37 | {
38 | return 0.6;
39 | }
40 |
41 | - (void)animateTransition:(id)transitionContext
42 | {
43 | _context = transitionContext;
44 | self.containerView = [transitionContext containerView];
45 |
46 | if (self.reverse)
47 | {
48 | CGSize screenSize = [UIScreen mainScreen].bounds.size;
49 | CGFloat size = MAX(screenSize.width, screenSize.height) * 1.2;
50 | CATransform3D fina3D = CATransform3DMakeScale((self.btnView.frame.size.width/size) * 1.4, (self.btnView.frame.size.height/size) * 1.4, 1);
51 |
52 | UIViewController* toVC = [_context viewControllerForKey:UITransitionContextToViewControllerKey];
53 | toVC.view.frame = [UIScreen mainScreen].bounds;
54 | toVC.view.alpha = 0;
55 |
56 | self.animationView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, MAX(screenSize.width, screenSize.height) * 1.8, MAX(screenSize.width, screenSize.height) * 1.8)];
57 | self.animationView.center = self.btnView.center;
58 | self.animationView.layer.cornerRadius = MAX(screenSize.width, screenSize.height) * 0.9;
59 | self.animationView.layer.masksToBounds = YES;
60 | [self.containerView addSubview:toVC.view];
61 | [self.containerView addSubview:self.animationView];
62 |
63 | [UIView animateWithDuration:[self transitionDuration:transitionContext]*0.6 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
64 | toVC.view.alpha = 1;
65 | self.animationView.backgroundColor = self.btnView.backgroundColor;
66 | self.animationView.layer.transform = fina3D;
67 | } completion:^(BOOL finished) {
68 | self.animationView.layer.cornerRadius = 0;
69 | }];
70 |
71 | [UIView animateWithDuration:[self transitionDuration:transitionContext]*0.3 delay:[self transitionDuration:transitionContext]*0.6 options:(UIViewAnimationOptionCurveEaseOut) animations:^{
72 | self.animationView.frame = _originRect;
73 |
74 | } completion:^(BOOL finished) {
75 | self.btnView.hidden = NO;
76 | [self.animationView removeFromSuperview];
77 | [self.containerView addSubview:toVC.view];
78 | [_context completeTransition:YES];
79 | }];
80 | }else
81 | {
82 | self.animationView = [[UIView alloc] initWithFrame:self.btnView.frame];
83 | self.animationView.layer.cornerRadius = 4;
84 | self.animationView.layer.masksToBounds = YES;
85 | self.animationView.frame = self.btnView.frame;
86 | self.animationView.backgroundColor = self.btnView.backgroundColor;
87 | self.btnView.hidden = YES;
88 |
89 |
90 | [self.containerView addSubview:self.animationView];
91 |
92 | CGPoint centerPoint = self.btnView.center;
93 | self.radius = MIN(self.btnView.frame.size.width, self.btnView.frame.size.height);
94 |
95 | [UIView animateWithDuration:[self transitionDuration:transitionContext]*0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
96 |
97 | self.animationView.frame = CGRectMake(0, 0, self.radius, self.radius);
98 | self.animationView.center = centerPoint;
99 | self.animationView.layer.cornerRadius = self.radius/2;
100 | self.animationView.layer.masksToBounds = YES;
101 |
102 | } completion:^(BOOL finished) {
103 |
104 | UIBezierPath* path = [[UIBezierPath alloc] init];
105 | [path addArcWithCenter:CGPointMake(self.radius/2, self.radius/2) radius:(self.radius/2 - 5) startAngle:0 endAngle:M_PI_2 * 2 clockwise:YES];
106 | self.shapeLayer = [[CAShapeLayer alloc] init];
107 | self.shapeLayer.lineWidth = 1;
108 | self.shapeLayer.strokeColor = [UIColor whiteColor].CGColor;
109 | self.shapeLayer.fillColor = self.btnView.backgroundColor.CGColor;
110 | self.shapeLayer.frame = CGRectMake(0, 0, self.radius, self.radius);
111 | self.shapeLayer.path = path.CGPath;
112 | [self.animationView.layer addSublayer:self.shapeLayer];
113 |
114 | CABasicAnimation* baseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
115 | baseAnimation.duration = 0.4;
116 | baseAnimation.fromValue = @(0);
117 | baseAnimation.toValue = @(2 * M_PI);
118 | baseAnimation.repeatCount = MAXFLOAT;
119 | [self.animationView.layer addAnimation:baseAnimation forKey:kRotationAnimation];
120 | }];
121 | }
122 | }
123 |
124 | - (void)stopAnimation
125 | {
126 | UIViewController* toVC = [_context viewControllerForKey:UITransitionContextToViewControllerKey];
127 | CGSize screenSize = [UIScreen mainScreen].bounds.size;
128 | toVC.view.frame = CGRectMake(0, 0, screenSize.width, screenSize.height);
129 | [self.containerView addSubview:toVC.view];
130 | toVC.view.alpha = 0;
131 | self.animationView.layer.transform = CATransform3DIdentity;
132 |
133 | [self.shapeLayer removeFromSuperlayer];
134 |
135 | [self.animationView.layer removeAllAnimations];
136 |
137 | CGFloat size = MAX(toVC.view.frame.size.width, toVC.view.frame.size.height) * 1.6;
138 | CATransform3D fina3D = CATransform3DMakeScale(size/self.radius, size/self.radius, 1);
139 | [UIView animateWithDuration:0.5 animations:^{
140 |
141 | self.animationView.layer.transform = fina3D;
142 | toVC.view.alpha = 1;
143 | } completion:^(BOOL finished) {
144 | [self.animationView removeFromSuperview];
145 | [_context completeTransition:YES];
146 | }];
147 | }
148 |
149 | @end
150 |
--------------------------------------------------------------------------------
/LoginTransition.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | D1B1A3F11B2138EB00CC6C3B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D1B1A3F01B2138EB00CC6C3B /* main.m */; };
11 | D1B1A3F41B2138EB00CC6C3B /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D1B1A3F31B2138EB00CC6C3B /* AppDelegate.m */; };
12 | D1B1A3F71B2138EB00CC6C3B /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D1B1A3F61B2138EB00CC6C3B /* ViewController.m */; };
13 | D1B1A3FA1B2138EB00CC6C3B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D1B1A3F81B2138EB00CC6C3B /* Main.storyboard */; };
14 | D1B1A3FC1B2138EB00CC6C3B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D1B1A3FB1B2138EB00CC6C3B /* Images.xcassets */; };
15 | D1B1A3FF1B2138EB00CC6C3B /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D1B1A3FD1B2138EB00CC6C3B /* LaunchScreen.xib */; };
16 | D1B1A40B1B2138EB00CC6C3B /* LoginTransitionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D1B1A40A1B2138EB00CC6C3B /* LoginTransitionTests.m */; };
17 | D1B1A4161B2138F800CC6C3B /* FYLoginTranslation.m in Sources */ = {isa = PBXBuildFile; fileRef = D1B1A4151B2138F800CC6C3B /* FYLoginTranslation.m */; };
18 | D1B1A41A1B21393A00CC6C3B /* SecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D1B1A4181B21393A00CC6C3B /* SecondViewController.m */; };
19 | D1B1A41B1B21393A00CC6C3B /* SecondViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D1B1A4191B21393A00CC6C3B /* SecondViewController.xib */; };
20 | D1B1A41D1B21A5E200CC6C3B /* background.jpg in Resources */ = {isa = PBXBuildFile; fileRef = D1B1A41C1B21A5E200CC6C3B /* background.jpg */; };
21 | D1B1A4231B21B32300CC6C3B /* login.jpg in Resources */ = {isa = PBXBuildFile; fileRef = D1B1A4221B21B32300CC6C3B /* login.jpg */; };
22 | /* End PBXBuildFile section */
23 |
24 | /* Begin PBXContainerItemProxy section */
25 | D1B1A4051B2138EB00CC6C3B /* PBXContainerItemProxy */ = {
26 | isa = PBXContainerItemProxy;
27 | containerPortal = D1B1A3E31B2138EB00CC6C3B /* Project object */;
28 | proxyType = 1;
29 | remoteGlobalIDString = D1B1A3EA1B2138EB00CC6C3B;
30 | remoteInfo = LoginTransition;
31 | };
32 | /* End PBXContainerItemProxy section */
33 |
34 | /* Begin PBXFileReference section */
35 | D1B1A3EB1B2138EB00CC6C3B /* LoginTransition.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LoginTransition.app; sourceTree = BUILT_PRODUCTS_DIR; };
36 | D1B1A3EF1B2138EB00CC6C3B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
37 | D1B1A3F01B2138EB00CC6C3B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
38 | D1B1A3F21B2138EB00CC6C3B /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
39 | D1B1A3F31B2138EB00CC6C3B /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
40 | D1B1A3F51B2138EB00CC6C3B /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
41 | D1B1A3F61B2138EB00CC6C3B /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
42 | D1B1A3F91B2138EB00CC6C3B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
43 | D1B1A3FB1B2138EB00CC6C3B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
44 | D1B1A3FE1B2138EB00CC6C3B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
45 | D1B1A4041B2138EB00CC6C3B /* LoginTransitionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LoginTransitionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
46 | D1B1A4091B2138EB00CC6C3B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
47 | D1B1A40A1B2138EB00CC6C3B /* LoginTransitionTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoginTransitionTests.m; sourceTree = ""; };
48 | D1B1A4141B2138F800CC6C3B /* FYLoginTranslation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FYLoginTranslation.h; sourceTree = ""; };
49 | D1B1A4151B2138F800CC6C3B /* FYLoginTranslation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FYLoginTranslation.m; sourceTree = ""; };
50 | D1B1A4171B21393A00CC6C3B /* SecondViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecondViewController.h; sourceTree = ""; };
51 | D1B1A4181B21393A00CC6C3B /* SecondViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecondViewController.m; sourceTree = ""; };
52 | D1B1A4191B21393A00CC6C3B /* SecondViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SecondViewController.xib; sourceTree = ""; };
53 | D1B1A41C1B21A5E200CC6C3B /* background.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = background.jpg; sourceTree = ""; };
54 | D1B1A4221B21B32300CC6C3B /* login.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = login.jpg; sourceTree = ""; };
55 | /* End PBXFileReference section */
56 |
57 | /* Begin PBXFrameworksBuildPhase section */
58 | D1B1A3E81B2138EB00CC6C3B /* Frameworks */ = {
59 | isa = PBXFrameworksBuildPhase;
60 | buildActionMask = 2147483647;
61 | files = (
62 | );
63 | runOnlyForDeploymentPostprocessing = 0;
64 | };
65 | D1B1A4011B2138EB00CC6C3B /* Frameworks */ = {
66 | isa = PBXFrameworksBuildPhase;
67 | buildActionMask = 2147483647;
68 | files = (
69 | );
70 | runOnlyForDeploymentPostprocessing = 0;
71 | };
72 | /* End PBXFrameworksBuildPhase section */
73 |
74 | /* Begin PBXGroup section */
75 | D1B1A3E21B2138EB00CC6C3B = {
76 | isa = PBXGroup;
77 | children = (
78 | D1B1A41C1B21A5E200CC6C3B /* background.jpg */,
79 | D1B1A4221B21B32300CC6C3B /* login.jpg */,
80 | D1B1A4141B2138F800CC6C3B /* FYLoginTranslation.h */,
81 | D1B1A4151B2138F800CC6C3B /* FYLoginTranslation.m */,
82 | D1B1A3ED1B2138EB00CC6C3B /* LoginTransition */,
83 | D1B1A4071B2138EB00CC6C3B /* LoginTransitionTests */,
84 | D1B1A3EC1B2138EB00CC6C3B /* Products */,
85 | );
86 | sourceTree = "";
87 | };
88 | D1B1A3EC1B2138EB00CC6C3B /* Products */ = {
89 | isa = PBXGroup;
90 | children = (
91 | D1B1A3EB1B2138EB00CC6C3B /* LoginTransition.app */,
92 | D1B1A4041B2138EB00CC6C3B /* LoginTransitionTests.xctest */,
93 | );
94 | name = Products;
95 | sourceTree = "";
96 | };
97 | D1B1A3ED1B2138EB00CC6C3B /* LoginTransition */ = {
98 | isa = PBXGroup;
99 | children = (
100 | D1B1A3F21B2138EB00CC6C3B /* AppDelegate.h */,
101 | D1B1A3F31B2138EB00CC6C3B /* AppDelegate.m */,
102 | D1B1A3F51B2138EB00CC6C3B /* ViewController.h */,
103 | D1B1A3F61B2138EB00CC6C3B /* ViewController.m */,
104 | D1B1A4171B21393A00CC6C3B /* SecondViewController.h */,
105 | D1B1A4181B21393A00CC6C3B /* SecondViewController.m */,
106 | D1B1A4191B21393A00CC6C3B /* SecondViewController.xib */,
107 | D1B1A3F81B2138EB00CC6C3B /* Main.storyboard */,
108 | D1B1A3FB1B2138EB00CC6C3B /* Images.xcassets */,
109 | D1B1A3FD1B2138EB00CC6C3B /* LaunchScreen.xib */,
110 | D1B1A3EE1B2138EB00CC6C3B /* Supporting Files */,
111 | );
112 | path = LoginTransition;
113 | sourceTree = "";
114 | };
115 | D1B1A3EE1B2138EB00CC6C3B /* Supporting Files */ = {
116 | isa = PBXGroup;
117 | children = (
118 | D1B1A3EF1B2138EB00CC6C3B /* Info.plist */,
119 | D1B1A3F01B2138EB00CC6C3B /* main.m */,
120 | );
121 | name = "Supporting Files";
122 | sourceTree = "";
123 | };
124 | D1B1A4071B2138EB00CC6C3B /* LoginTransitionTests */ = {
125 | isa = PBXGroup;
126 | children = (
127 | D1B1A40A1B2138EB00CC6C3B /* LoginTransitionTests.m */,
128 | D1B1A4081B2138EB00CC6C3B /* Supporting Files */,
129 | );
130 | path = LoginTransitionTests;
131 | sourceTree = "";
132 | };
133 | D1B1A4081B2138EB00CC6C3B /* Supporting Files */ = {
134 | isa = PBXGroup;
135 | children = (
136 | D1B1A4091B2138EB00CC6C3B /* Info.plist */,
137 | );
138 | name = "Supporting Files";
139 | sourceTree = "";
140 | };
141 | /* End PBXGroup section */
142 |
143 | /* Begin PBXNativeTarget section */
144 | D1B1A3EA1B2138EB00CC6C3B /* LoginTransition */ = {
145 | isa = PBXNativeTarget;
146 | buildConfigurationList = D1B1A40E1B2138EB00CC6C3B /* Build configuration list for PBXNativeTarget "LoginTransition" */;
147 | buildPhases = (
148 | D1B1A3E71B2138EB00CC6C3B /* Sources */,
149 | D1B1A3E81B2138EB00CC6C3B /* Frameworks */,
150 | D1B1A3E91B2138EB00CC6C3B /* Resources */,
151 | );
152 | buildRules = (
153 | );
154 | dependencies = (
155 | );
156 | name = LoginTransition;
157 | productName = LoginTransition;
158 | productReference = D1B1A3EB1B2138EB00CC6C3B /* LoginTransition.app */;
159 | productType = "com.apple.product-type.application";
160 | };
161 | D1B1A4031B2138EB00CC6C3B /* LoginTransitionTests */ = {
162 | isa = PBXNativeTarget;
163 | buildConfigurationList = D1B1A4111B2138EB00CC6C3B /* Build configuration list for PBXNativeTarget "LoginTransitionTests" */;
164 | buildPhases = (
165 | D1B1A4001B2138EB00CC6C3B /* Sources */,
166 | D1B1A4011B2138EB00CC6C3B /* Frameworks */,
167 | D1B1A4021B2138EB00CC6C3B /* Resources */,
168 | );
169 | buildRules = (
170 | );
171 | dependencies = (
172 | D1B1A4061B2138EB00CC6C3B /* PBXTargetDependency */,
173 | );
174 | name = LoginTransitionTests;
175 | productName = LoginTransitionTests;
176 | productReference = D1B1A4041B2138EB00CC6C3B /* LoginTransitionTests.xctest */;
177 | productType = "com.apple.product-type.bundle.unit-test";
178 | };
179 | /* End PBXNativeTarget section */
180 |
181 | /* Begin PBXProject section */
182 | D1B1A3E31B2138EB00CC6C3B /* Project object */ = {
183 | isa = PBXProject;
184 | attributes = {
185 | LastUpgradeCheck = 0630;
186 | ORGANIZATIONNAME = fanyingzhao;
187 | TargetAttributes = {
188 | D1B1A3EA1B2138EB00CC6C3B = {
189 | CreatedOnToolsVersion = 6.3.2;
190 | };
191 | D1B1A4031B2138EB00CC6C3B = {
192 | CreatedOnToolsVersion = 6.3.2;
193 | TestTargetID = D1B1A3EA1B2138EB00CC6C3B;
194 | };
195 | };
196 | };
197 | buildConfigurationList = D1B1A3E61B2138EB00CC6C3B /* Build configuration list for PBXProject "LoginTransition" */;
198 | compatibilityVersion = "Xcode 3.2";
199 | developmentRegion = English;
200 | hasScannedForEncodings = 0;
201 | knownRegions = (
202 | en,
203 | Base,
204 | );
205 | mainGroup = D1B1A3E21B2138EB00CC6C3B;
206 | productRefGroup = D1B1A3EC1B2138EB00CC6C3B /* Products */;
207 | projectDirPath = "";
208 | projectRoot = "";
209 | targets = (
210 | D1B1A3EA1B2138EB00CC6C3B /* LoginTransition */,
211 | D1B1A4031B2138EB00CC6C3B /* LoginTransitionTests */,
212 | );
213 | };
214 | /* End PBXProject section */
215 |
216 | /* Begin PBXResourcesBuildPhase section */
217 | D1B1A3E91B2138EB00CC6C3B /* Resources */ = {
218 | isa = PBXResourcesBuildPhase;
219 | buildActionMask = 2147483647;
220 | files = (
221 | D1B1A41B1B21393A00CC6C3B /* SecondViewController.xib in Resources */,
222 | D1B1A41D1B21A5E200CC6C3B /* background.jpg in Resources */,
223 | D1B1A3FA1B2138EB00CC6C3B /* Main.storyboard in Resources */,
224 | D1B1A3FF1B2138EB00CC6C3B /* LaunchScreen.xib in Resources */,
225 | D1B1A3FC1B2138EB00CC6C3B /* Images.xcassets in Resources */,
226 | D1B1A4231B21B32300CC6C3B /* login.jpg in Resources */,
227 | );
228 | runOnlyForDeploymentPostprocessing = 0;
229 | };
230 | D1B1A4021B2138EB00CC6C3B /* Resources */ = {
231 | isa = PBXResourcesBuildPhase;
232 | buildActionMask = 2147483647;
233 | files = (
234 | );
235 | runOnlyForDeploymentPostprocessing = 0;
236 | };
237 | /* End PBXResourcesBuildPhase section */
238 |
239 | /* Begin PBXSourcesBuildPhase section */
240 | D1B1A3E71B2138EB00CC6C3B /* Sources */ = {
241 | isa = PBXSourcesBuildPhase;
242 | buildActionMask = 2147483647;
243 | files = (
244 | D1B1A41A1B21393A00CC6C3B /* SecondViewController.m in Sources */,
245 | D1B1A3F71B2138EB00CC6C3B /* ViewController.m in Sources */,
246 | D1B1A3F41B2138EB00CC6C3B /* AppDelegate.m in Sources */,
247 | D1B1A4161B2138F800CC6C3B /* FYLoginTranslation.m in Sources */,
248 | D1B1A3F11B2138EB00CC6C3B /* main.m in Sources */,
249 | );
250 | runOnlyForDeploymentPostprocessing = 0;
251 | };
252 | D1B1A4001B2138EB00CC6C3B /* Sources */ = {
253 | isa = PBXSourcesBuildPhase;
254 | buildActionMask = 2147483647;
255 | files = (
256 | D1B1A40B1B2138EB00CC6C3B /* LoginTransitionTests.m in Sources */,
257 | );
258 | runOnlyForDeploymentPostprocessing = 0;
259 | };
260 | /* End PBXSourcesBuildPhase section */
261 |
262 | /* Begin PBXTargetDependency section */
263 | D1B1A4061B2138EB00CC6C3B /* PBXTargetDependency */ = {
264 | isa = PBXTargetDependency;
265 | target = D1B1A3EA1B2138EB00CC6C3B /* LoginTransition */;
266 | targetProxy = D1B1A4051B2138EB00CC6C3B /* PBXContainerItemProxy */;
267 | };
268 | /* End PBXTargetDependency section */
269 |
270 | /* Begin PBXVariantGroup section */
271 | D1B1A3F81B2138EB00CC6C3B /* Main.storyboard */ = {
272 | isa = PBXVariantGroup;
273 | children = (
274 | D1B1A3F91B2138EB00CC6C3B /* Base */,
275 | );
276 | name = Main.storyboard;
277 | sourceTree = "";
278 | };
279 | D1B1A3FD1B2138EB00CC6C3B /* LaunchScreen.xib */ = {
280 | isa = PBXVariantGroup;
281 | children = (
282 | D1B1A3FE1B2138EB00CC6C3B /* Base */,
283 | );
284 | name = LaunchScreen.xib;
285 | sourceTree = "";
286 | };
287 | /* End PBXVariantGroup section */
288 |
289 | /* Begin XCBuildConfiguration section */
290 | D1B1A40C1B2138EB00CC6C3B /* Debug */ = {
291 | isa = XCBuildConfiguration;
292 | buildSettings = {
293 | ALWAYS_SEARCH_USER_PATHS = NO;
294 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
295 | CLANG_CXX_LIBRARY = "libc++";
296 | CLANG_ENABLE_MODULES = YES;
297 | CLANG_ENABLE_OBJC_ARC = YES;
298 | CLANG_WARN_BOOL_CONVERSION = YES;
299 | CLANG_WARN_CONSTANT_CONVERSION = YES;
300 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
301 | CLANG_WARN_EMPTY_BODY = YES;
302 | CLANG_WARN_ENUM_CONVERSION = YES;
303 | CLANG_WARN_INT_CONVERSION = YES;
304 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
305 | CLANG_WARN_UNREACHABLE_CODE = YES;
306 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
307 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
308 | COPY_PHASE_STRIP = NO;
309 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
310 | ENABLE_STRICT_OBJC_MSGSEND = YES;
311 | GCC_C_LANGUAGE_STANDARD = gnu99;
312 | GCC_DYNAMIC_NO_PIC = NO;
313 | GCC_NO_COMMON_BLOCKS = YES;
314 | GCC_OPTIMIZATION_LEVEL = 0;
315 | GCC_PREPROCESSOR_DEFINITIONS = (
316 | "DEBUG=1",
317 | "$(inherited)",
318 | );
319 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
320 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
321 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
322 | GCC_WARN_UNDECLARED_SELECTOR = YES;
323 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
324 | GCC_WARN_UNUSED_FUNCTION = YES;
325 | GCC_WARN_UNUSED_VARIABLE = YES;
326 | IPHONEOS_DEPLOYMENT_TARGET = 8.3;
327 | MTL_ENABLE_DEBUG_INFO = YES;
328 | ONLY_ACTIVE_ARCH = YES;
329 | SDKROOT = iphoneos;
330 | };
331 | name = Debug;
332 | };
333 | D1B1A40D1B2138EB00CC6C3B /* Release */ = {
334 | isa = XCBuildConfiguration;
335 | buildSettings = {
336 | ALWAYS_SEARCH_USER_PATHS = NO;
337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
338 | CLANG_CXX_LIBRARY = "libc++";
339 | CLANG_ENABLE_MODULES = YES;
340 | CLANG_ENABLE_OBJC_ARC = YES;
341 | CLANG_WARN_BOOL_CONVERSION = YES;
342 | CLANG_WARN_CONSTANT_CONVERSION = YES;
343 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
344 | CLANG_WARN_EMPTY_BODY = YES;
345 | CLANG_WARN_ENUM_CONVERSION = YES;
346 | CLANG_WARN_INT_CONVERSION = YES;
347 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
348 | CLANG_WARN_UNREACHABLE_CODE = YES;
349 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
350 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
351 | COPY_PHASE_STRIP = NO;
352 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
353 | ENABLE_NS_ASSERTIONS = NO;
354 | ENABLE_STRICT_OBJC_MSGSEND = YES;
355 | GCC_C_LANGUAGE_STANDARD = gnu99;
356 | GCC_NO_COMMON_BLOCKS = YES;
357 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
358 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
359 | GCC_WARN_UNDECLARED_SELECTOR = YES;
360 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
361 | GCC_WARN_UNUSED_FUNCTION = YES;
362 | GCC_WARN_UNUSED_VARIABLE = YES;
363 | IPHONEOS_DEPLOYMENT_TARGET = 8.3;
364 | MTL_ENABLE_DEBUG_INFO = NO;
365 | SDKROOT = iphoneos;
366 | VALIDATE_PRODUCT = YES;
367 | };
368 | name = Release;
369 | };
370 | D1B1A40F1B2138EB00CC6C3B /* Debug */ = {
371 | isa = XCBuildConfiguration;
372 | buildSettings = {
373 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
374 | INFOPLIST_FILE = LoginTransition/Info.plist;
375 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
376 | PRODUCT_NAME = "$(TARGET_NAME)";
377 | };
378 | name = Debug;
379 | };
380 | D1B1A4101B2138EB00CC6C3B /* Release */ = {
381 | isa = XCBuildConfiguration;
382 | buildSettings = {
383 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
384 | INFOPLIST_FILE = LoginTransition/Info.plist;
385 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
386 | PRODUCT_NAME = "$(TARGET_NAME)";
387 | };
388 | name = Release;
389 | };
390 | D1B1A4121B2138EB00CC6C3B /* Debug */ = {
391 | isa = XCBuildConfiguration;
392 | buildSettings = {
393 | BUNDLE_LOADER = "$(TEST_HOST)";
394 | FRAMEWORK_SEARCH_PATHS = (
395 | "$(SDKROOT)/Developer/Library/Frameworks",
396 | "$(inherited)",
397 | );
398 | GCC_PREPROCESSOR_DEFINITIONS = (
399 | "DEBUG=1",
400 | "$(inherited)",
401 | );
402 | INFOPLIST_FILE = LoginTransitionTests/Info.plist;
403 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
404 | PRODUCT_NAME = "$(TARGET_NAME)";
405 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LoginTransition.app/LoginTransition";
406 | };
407 | name = Debug;
408 | };
409 | D1B1A4131B2138EB00CC6C3B /* Release */ = {
410 | isa = XCBuildConfiguration;
411 | buildSettings = {
412 | BUNDLE_LOADER = "$(TEST_HOST)";
413 | FRAMEWORK_SEARCH_PATHS = (
414 | "$(SDKROOT)/Developer/Library/Frameworks",
415 | "$(inherited)",
416 | );
417 | INFOPLIST_FILE = LoginTransitionTests/Info.plist;
418 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
419 | PRODUCT_NAME = "$(TARGET_NAME)";
420 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LoginTransition.app/LoginTransition";
421 | };
422 | name = Release;
423 | };
424 | /* End XCBuildConfiguration section */
425 |
426 | /* Begin XCConfigurationList section */
427 | D1B1A3E61B2138EB00CC6C3B /* Build configuration list for PBXProject "LoginTransition" */ = {
428 | isa = XCConfigurationList;
429 | buildConfigurations = (
430 | D1B1A40C1B2138EB00CC6C3B /* Debug */,
431 | D1B1A40D1B2138EB00CC6C3B /* Release */,
432 | );
433 | defaultConfigurationIsVisible = 0;
434 | defaultConfigurationName = Release;
435 | };
436 | D1B1A40E1B2138EB00CC6C3B /* Build configuration list for PBXNativeTarget "LoginTransition" */ = {
437 | isa = XCConfigurationList;
438 | buildConfigurations = (
439 | D1B1A40F1B2138EB00CC6C3B /* Debug */,
440 | D1B1A4101B2138EB00CC6C3B /* Release */,
441 | );
442 | defaultConfigurationIsVisible = 0;
443 | defaultConfigurationName = Release;
444 | };
445 | D1B1A4111B2138EB00CC6C3B /* Build configuration list for PBXNativeTarget "LoginTransitionTests" */ = {
446 | isa = XCConfigurationList;
447 | buildConfigurations = (
448 | D1B1A4121B2138EB00CC6C3B /* Debug */,
449 | D1B1A4131B2138EB00CC6C3B /* Release */,
450 | );
451 | defaultConfigurationIsVisible = 0;
452 | defaultConfigurationName = Release;
453 | };
454 | /* End XCConfigurationList section */
455 | };
456 | rootObject = D1B1A3E31B2138EB00CC6C3B /* Project object */;
457 | }
458 |
--------------------------------------------------------------------------------