summaryrefslogtreecommitdiff
path: root/SmartDeviceLink-iOS/SmartDeviceLink_Example/Classes/ConnectionAnimatedTransition.m
blob: 46b87b1d3053868d8eeaebb57bc4ea8fedeec9c1 (plain)
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
//
//  ConnectionAnimatedTransition.m
//  SmartDeviceLink-iOS
//
//  Created by Joel Fischer on 2/18/15.
//  Copyright (c) 2015 smartdevicelink. All rights reserved.
//

#import "ConnectionAnimatedTransition.h"


static CGFloat const ChildViewPadding = 16;
static CGFloat const DampingFactor = 0.8;
static CGFloat const InitialSpringVelocity = 0.6;


@implementation ConnectionAnimatedTransition

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
    return 0.4;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    
    BOOL goingRight = ([transitionContext initialFrameForViewController:toViewController].origin.x < [transitionContext finalFrameForViewController:toViewController].origin.x);
    CGFloat travelDistance = [transitionContext containerView].bounds.size.width + ChildViewPadding;
    CGAffineTransform travel = CGAffineTransformMakeTranslation((goingRight ? travelDistance : -travelDistance), 0);
    
    [[transitionContext containerView] addSubview:toViewController.view];
    toViewController.view.alpha = 0;
    toViewController.view.transform = CGAffineTransformInvert(travel);
    
    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:DampingFactor initialSpringVelocity:InitialSpringVelocity options:kNilOptions animations:^{
        fromViewController.view.transform = travel;
        fromViewController.view.alpha = 0;
        
        toViewController.view.transform = [transitionContext targetTransform];
        toViewController.view.alpha = 1;
    } completion:^(BOOL finished) {
        fromViewController.view.transform = [transitionContext targetTransform];
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];
}

@end