From 38f6bb528c2f27daf2b6e7d7e83ec9f9d97bba28 Mon Sep 17 00:00:00 2001 From: Aryan Ghassemi Date: Sat, 19 Apr 2014 10:43:17 -0700 Subject: [PATCH] Added new methods used for switching between ViewControllers and deprecated switchToViewController:withCompletion:. These new methods have more meaningfull names and decribe exactly what happends during a switch. You can also disable slide out animation using these new methods --- SlideMenu/Helper Classes/MenuViewController.m | 2 +- SlideMenu/Source/SlideNavigationController.h | 6 +- SlideMenu/Source/SlideNavigationController.m | 96 +++++++++++++++---- 3 files changed, 83 insertions(+), 21 deletions(-) diff --git a/SlideMenu/Helper Classes/MenuViewController.m b/SlideMenu/Helper Classes/MenuViewController.m index 646ea43..dc9f75b 100755 --- a/SlideMenu/Helper Classes/MenuViewController.m +++ b/SlideMenu/Helper Classes/MenuViewController.m @@ -120,7 +120,7 @@ break; } - [[SlideNavigationController sharedInstance] switchToViewController:vc withCompletion:nil]; + [[SlideNavigationController sharedInstance] popToRootAndSwitchToViewController:vc withCompletion:nil]; } else { diff --git a/SlideMenu/Source/SlideNavigationController.h b/SlideMenu/Source/SlideNavigationController.h index 8471996..edbb805 100644 --- a/SlideMenu/Source/SlideNavigationController.h +++ b/SlideMenu/Source/SlideNavigationController.h @@ -53,7 +53,11 @@ typedef enum{ @property (nonatomic, strong) id menuRevealAnimator; + (SlideNavigationController *)sharedInstance; -- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion; +- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion __deprecated; +- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController withSlideOutAnimation:(BOOL)slideOutAnimation andCompletion:(void (^)())completion; +- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion; +- (void)popAllAndSwitchToViewController:(UIViewController *)viewController withSlideOutAnimation:(BOOL)slideOutAnimation andCompletion:(void (^)())completion; +- (void)popAllAndSwitchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion; - (void)bounceMenu:(Menu)menu withCompletion:(void (^)())completion; - (void)openMenu:(Menu)menu withCompletion:(void (^)())completion; - (void)closeMenuWithCompletion:(void (^)())completion; diff --git a/SlideMenu/Source/SlideNavigationController.m b/SlideMenu/Source/SlideNavigationController.m index 839e501..debab65 100644 --- a/SlideMenu/Source/SlideNavigationController.m +++ b/SlideMenu/Source/SlideNavigationController.m @@ -28,6 +28,11 @@ #import "SlideNavigationController.h" #import "SlideNavigationContorllerAnimator.h" +typedef enum { + PopTypeAll, + PopTypeRoot +} PopType; + @interface SlideNavigationController() @property (nonatomic, strong) UITapGestureRecognizer *tapRecognizer; @property (nonatomic, strong) UIPanGestureRecognizer *panRecognizer; @@ -171,7 +176,10 @@ static SlideNavigationController *singletonInstance; }]; } -- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion +- (void)switchToViewController:(UIViewController *)viewController + withSlideOutAnimation:(BOOL)slideOutAnimation + popType:(PopType)poptype + andCompletion:(void (^)())completion { if (self.avoidSwitchingToSameClassViewController && [self.topViewController isKindOfClass:viewController.class]) { @@ -179,36 +187,86 @@ static SlideNavigationController *singletonInstance; return; } - if ([self isMenuOpen]) - { - [UIView animateWithDuration:MENU_SLIDE_ANIMATION_DURATION - delay:0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - CGFloat width = self.horizontalSize; - CGFloat moveLocation = (self.horizontalLocation> 0) ? width : -1*width; - [self moveHorizontallyToLocation:moveLocation]; - } completion:^(BOOL finished) { - + void (^switchAndCallCompletion)(BOOL) = ^(BOOL closeMenuBeforeCallingCompletion) { + if (poptype == PopTypeAll) { + [self setViewControllers:@[viewController]]; + } + else { [super popToRootViewControllerAnimated:NO]; [super pushViewController:viewController animated:NO]; - + } + + if (closeMenuBeforeCallingCompletion) + { [self closeMenuWithCompletion:^{ if (completion) completion(); }]; - }]; + } + else + { + if (completion) + completion(); + } + }; + + if ([self isMenuOpen]) + { + if (slideOutAnimation) + { + [UIView animateWithDuration:(slideOutAnimation) ? MENU_SLIDE_ANIMATION_DURATION : 0 + delay:0 + options:UIViewAnimationOptionCurveEaseOut + animations:^{ + CGFloat width = self.horizontalSize; + CGFloat moveLocation = (self.horizontalLocation> 0) ? width : -1*width; + [self moveHorizontallyToLocation:moveLocation]; + } completion:^(BOOL finished) { + switchAndCallCompletion(YES); + }]; + } + else + { + switchAndCallCompletion(YES); + } } else { - [super popToRootViewControllerAnimated:NO]; - [super pushViewController:viewController animated:YES]; - - if (completion) - completion(); + switchAndCallCompletion(NO); } } +- (void)switchToViewController:(UIViewController *)viewController withCompletion:(void (^)())completion +{ + [self switchToViewController:viewController withSlideOutAnimation:YES popType:PopTypeRoot andCompletion:completion]; +} + +- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController + withSlideOutAnimation:(BOOL)slideOutAnimation + andCompletion:(void (^)())completion +{ + [self switchToViewController:viewController withSlideOutAnimation:slideOutAnimation popType:PopTypeRoot andCompletion:completion]; +} + +- (void)popToRootAndSwitchToViewController:(UIViewController *)viewController + withCompletion:(void (^)())completion +{ + [self switchToViewController:viewController withSlideOutAnimation:YES popType:PopTypeRoot andCompletion:completion]; +} + +- (void)popAllAndSwitchToViewController:(UIViewController *)viewController + withSlideOutAnimation:(BOOL)slideOutAnimation + andCompletion:(void (^)())completion +{ + [self switchToViewController:viewController withSlideOutAnimation:slideOutAnimation popType:PopTypeAll andCompletion:completion]; +} + +- (void)popAllAndSwitchToViewController:(UIViewController *)viewController + withCompletion:(void (^)())completion +{ + [self switchToViewController:viewController withSlideOutAnimation:YES popType:PopTypeAll andCompletion:completion]; +} + - (void)closeMenuWithCompletion:(void (^)())completion { [self closeMenuWithDuration:MENU_SLIDE_ANIMATION_DURATION andCompletion:completion];