-
-
Save ArtFeel/7690431 to your computer and use it in GitHub Desktop.
// | |
// MGSlideAnimatedTransitioning | |
// | |
// Created by Philip Vasilchenko on 27.11.13. | |
// | |
#import <UIKit/UIKit.h> | |
@interface MGSlideAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning> | |
@property (nonatomic, assign) BOOL reverse; | |
- (instancetype)initWithReverse:(BOOL)reverse; | |
+ (instancetype)transitioningWithReverse:(BOOL)reverse; | |
@end |
// | |
// MGSlideAnimatedTransitioning | |
// | |
// Created by Philip Vasilchenko on 27.11.13. | |
// | |
#import "MGSlideAnimatedTransitioning.h" | |
@implementation MGSlideAnimatedTransitioning | |
static const NSTimeInterval kMGSlideAnimatedTransitioningDuration = 0.3f; | |
#pragma mark - Initialization | |
- (instancetype)initWithReverse:(BOOL)reverse { | |
self = [super init]; | |
if ( self ) { | |
self.reverse = reverse; | |
} | |
return self; | |
} | |
+ (instancetype)transitioningWithReverse:(BOOL)reverse { | |
return [[self alloc] initWithReverse:reverse]; | |
} | |
#pragma mark - Transitioning | |
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { | |
NSString * fromKey = UITransitionContextFromViewControllerKey; | |
NSString * toKey = UITransitionContextToViewControllerKey; | |
UIViewController * fromViewController = [transitionContext viewControllerForKey:fromKey]; | |
UIViewController * toViewController = [transitionContext viewControllerForKey:toKey]; | |
UIView * containerView = [transitionContext containerView]; | |
UIView * fromView = fromViewController.view; | |
UIView * toView = toViewController.view; | |
NSTimeInterval duration = [self transitionDuration:transitionContext]; | |
CGFloat viewWidth = CGRectGetWidth(containerView.frame); | |
__block CGRect fromViewFrame = fromView.frame; | |
__block CGRect toViewFrame = toView.frame; | |
toViewFrame.origin.x = self.reverse ? -viewWidth : viewWidth; | |
toView.frame = toViewFrame; | |
[containerView addSubview:toView]; | |
[UIView animateWithDuration:duration | |
delay:0 | |
options:UIViewAnimationOptionCurveEaseInOut | |
animations:^{ | |
toViewFrame.origin.x = CGRectGetMinX(containerView.frame); | |
fromViewFrame.origin.x = self.reverse ? viewWidth : -viewWidth; | |
toView.frame = toViewFrame; | |
fromView.frame = fromViewFrame; | |
} | |
completion:^(BOOL finished) { | |
if ( self.reverse ) { [fromView removeFromSuperview]; } | |
[transitionContext completeTransition:![transitionContext transitionWasCancelled]]; | |
}]; | |
} | |
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { | |
return kMGSlideAnimatedTransitioningDuration; | |
} | |
@end |
I second @StanchoBancho, those edits need to be made. Works after that. Thanks!
@StanchoBancho, thanks for the feedback, I fixed it.
In my previous code I'm using FrameAccessor pod, highly recommend it.
Great approach!
In case the navigation bar is hidden for one view controller and visible for the other, you need a little adjustment. In the animation block, below line 56, add:
toViewFrame.origin.y = toViewController.navigationController.navigationBarHidden ?
0 : toViewController.navigationController.navigationBar.frame.origin.y +
toViewController.navigationController.navigationBar.frame.size.height;
Works great with swift too - thanks
Navigation bar does not move along with viewcontroller, results in navigationbar updates later. Can anyone please give a fix for this?
Any idea on how to get this to be interactive?
Can you please tell me how to use these classes in my project ?
Hello,
Although this brought back the transition I needed, if I rotated my app after using the transition and then transitioned back, the frame would be the "old" frame and not the new rotation. I had to make this change to make sure I was transitioning back to the proper view:
//__block CGRect toViewFrame = toView.frame;
__block CGRect toViewFrame = [transitionContext finalFrameForViewController:toViewController];
You have 4 small errors:
But if we skip that, your solution is cool. :)