Skip to content

Instantly share code, notes, and snippets.

@hartbit
Last active December 30, 2015 00:18
Show Gist options
  • Save hartbit/7748145 to your computer and use it in GitHub Desktop.
Save hartbit/7748145 to your computer and use it in GitHub Desktop.
@interface AWRParallaxAnimationController : ECSlidingAnimationController <ECSlidingViewControllerLayout>
@property (nonatomic) CGFloat parallaxFactor;
@end
@implementation AWRParallaxAnimationController
#pragma mark - ECSlidingViewControllerLayout
- (CGRect)slidingViewController:(ECSlidingViewController*)slidingViewController
frameForViewController:(UIViewController*)viewController
topViewPosition:(ECSlidingViewControllerTopViewPosition)topViewPosition
{
CGRect frame = slidingViewController.view.bounds;
if (viewController == slidingViewController.topViewController) {
if (topViewPosition == ECSlidingViewControllerTopViewPositionAnchoredRight) {
frame.origin.x = slidingViewController.anchorRightRevealAmount;
} else if (topViewPosition == ECSlidingViewControllerTopViewPositionAnchoredLeft) {
frame.origin.x = -slidingViewController.anchorLeftRevealAmount;
}
} else if (viewController == slidingViewController.underLeftViewController) {
if (topViewPosition != ECSlidingViewControllerTopViewPositionAnchoredRight) {
frame.origin.x = -slidingViewController.anchorRightRevealAmount * self.parallaxFactor;
}
} else if (viewController == slidingViewController.underRightViewController) {
if (topViewPosition != ECSlidingViewControllerTopViewPositionAnchoredLeft) {
frame.origin.x = slidingViewController.anchorLeftRevealAmount * self.parallaxFactor;
}
}
return frame;
}
#pragma mark - UIViewControllerAnimatedTransitioning
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext {
return 0.25;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
CGRect fromViewInitialFrame = [transitionContext initialFrameForViewController:fromViewController];
CGRect fromViewFinalFrame = [transitionContext finalFrameForViewController:fromViewController];
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
CGRect toViewInitialFrame = [transitionContext initialFrameForViewController:toViewController];
CGRect toViewFinalFrame = [transitionContext finalFrameForViewController:toViewController];
UIView* containerView = [transitionContext containerView];
fromViewController.view.frame = fromViewInitialFrame;
toViewController.view.frame = toViewInitialFrame;
UIViewController* topViewController = [transitionContext viewControllerForKey:ECTransitionContextTopViewControllerKey];
if (toViewController != topViewController) {
[containerView insertSubview:toViewController.view belowSubview:fromViewController.view];
}
NSTimeInterval duration = [self transitionDuration:transitionContext];
[UIView animateWithDuration:duration animations:^{
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
fromViewController.view.frame = fromViewFinalFrame;
toViewController.view.frame = toViewFinalFrame;
completion:^(BOOL finished) {
if ([transitionContext transitionWasCancelled]) {
fromViewController.view.frame = fromViewInitialFrame;
toViewController.view.frame = toViewInitialFrame;
} else if (toViewController == topViewController) {
[fromViewController.view removeFromSuperview];
}
[transitionContext completeTransition:finished];
}];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment