From a6e772c6576eba7860d22f3438998351e0713773 Mon Sep 17 00:00:00 2001 From: zakhej Date: Mon, 17 Nov 2014 12:17:29 +0300 Subject: [PATCH 1/2] Positioning mode and pan gesture delegate --- MFSideMenu/MFSideMenuContainerViewController.h | 14 ++++++++++++++ MFSideMenu/MFSideMenuContainerViewController.m | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/MFSideMenu/MFSideMenuContainerViewController.h b/MFSideMenu/MFSideMenuContainerViewController.h index 0537f1a..7155630 100644 --- a/MFSideMenu/MFSideMenuContainerViewController.h +++ b/MFSideMenu/MFSideMenuContainerViewController.h @@ -18,6 +18,11 @@ typedef enum { MFSideMenuPanModeDefault = MFSideMenuPanModeCenterViewController | MFSideMenuPanModeSideMenu } MFSideMenuPanMode; +typedef enum { + MFSideMenuPositioningModeUnderTop, // side controllers' z-index will be greater than center controller's z-index + MFSideMenuPositioningModeSideBySide // side controllers will reside side by side with center controller +} MFSideMenuPositioningMode; + typedef enum { MFSideMenuStateClosed, // the menu is closed MFSideMenuStateLeftMenuOpen, // the left-hand menu is open @@ -31,6 +36,13 @@ typedef enum { MFSideMenuStateEventMenuDidClose // the menu finished closing } MFSideMenuStateEvent; +@protocol MFSideMenuContainerViewControllerPanProtocol + +@optional +- (void)mfSideMenuPanGestureRecognizerDidPanWithOffset:(CGFloat)offset; + +@end + @interface MFSideMenuContainerViewController : UIViewController @@ -44,6 +56,7 @@ typedef enum { @property (nonatomic, assign) MFSideMenuState menuState; @property (nonatomic, assign) MFSideMenuPanMode panMode; +@property (nonatomic, assign) MFSideMenuPositioningMode positioningMode; // menu open/close animation duration -- user can pan faster than default duration, max duration sets the limit @property (nonatomic, assign) CGFloat menuAnimationDefaultDuration; @@ -61,6 +74,7 @@ typedef enum { @property (nonatomic, assign) BOOL menuSlideAnimationEnabled; @property (nonatomic, assign) CGFloat menuSlideAnimationFactor; // higher = less menu movement on animation +@property (nonatomic, assign) id panGestureDelegate; - (void)toggleLeftSideMenuCompletion:(void (^)(void))completion; - (void)toggleRightSideMenuCompletion:(void (^)(void))completion; diff --git a/MFSideMenu/MFSideMenuContainerViewController.m b/MFSideMenu/MFSideMenuContainerViewController.m index 70216e0..bf2dc50 100644 --- a/MFSideMenu/MFSideMenuContainerViewController.m +++ b/MFSideMenu/MFSideMenuContainerViewController.m @@ -759,6 +759,20 @@ - (void) setCenterViewControllerOffset:(CGFloat)xOffset { frame.origin.x = xOffset; [self.centerViewController view].frame = frame; + if (self.positioningMode == MFSideMenuPositioningModeSideBySide) { + frame = [self.leftMenuViewController view].frame; + frame.origin.x = [self.centerViewController view].frame.origin.x - frame.size.width; + [self.leftMenuViewController view].frame = frame; + + frame = [self.rightMenuViewController view].frame; + frame.origin.x = [self.centerViewController view].frame.origin.x - [self.centerViewController view].frame.size.width; + [self.rightMenuViewController view].frame = frame; + } + + if (self.panGestureDelegate) { + [self.panGestureDelegate mfSideMenuPanGestureRecognizerDidPanWithOffset:xOffset]; + } + if(!self.menuSlideAnimationEnabled) return; if(xOffset > 0){ From 2c7a43b325f801dce6c9a6d4de22827fc03ec4d5 Mon Sep 17 00:00:00 2001 From: Olifer Nikita Date: Mon, 28 Sep 2015 15:52:08 +0300 Subject: [PATCH 2/2] Fixed gesture recognizers holding. --- .../MFSideMenuContainerViewController.m | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/MFSideMenu/MFSideMenuContainerViewController.m b/MFSideMenu/MFSideMenuContainerViewController.m index bf2dc50..3238315 100644 --- a/MFSideMenu/MFSideMenuContainerViewController.m +++ b/MFSideMenu/MFSideMenuContainerViewController.m @@ -24,6 +24,9 @@ @interface MFSideMenuContainerViewController () @property (nonatomic, assign) CGFloat panGestureVelocity; @property (nonatomic, assign) MFSideMenuPanDirection panDirection; +@property (nonatomic, strong) UIGestureRecognizer *panGestureRecognizer; +@property (nonatomic, strong) UIGestureRecognizer *tapGestureRecognizer; + @property (nonatomic, assign) BOOL viewHasAppeared; @end @@ -269,16 +272,25 @@ - (void)removeChildViewControllerFromContainer:(UIViewController *)childViewCont #pragma mark - UIGestureRecognizer Helpers - (UIPanGestureRecognizer *)panGestureRecognizer { + + if (!_panGestureRecognizer) { + _panGestureRecognizer = [self createPanGestureRecognizer]; + } + + return _panGestureRecognizer; +} + +- (UIPanGestureRecognizer *)createPanGestureRecognizer { UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] - initWithTarget:self action:@selector(handlePan:)]; - [recognizer setMaximumNumberOfTouches:1]; + initWithTarget:self action:@selector(handlePan:)]; + [recognizer setMaximumNumberOfTouches:1]; [recognizer setDelegate:self]; return recognizer; } - (void)addGestureRecognizers { [self addCenterGestureRecognizers]; - [menuContainerView addGestureRecognizer:[self panGestureRecognizer]]; + [menuContainerView addGestureRecognizer:[self createPanGestureRecognizer]]; } - (void)removeCenterGestureRecognizers @@ -300,11 +312,12 @@ - (void)addCenterGestureRecognizers - (UITapGestureRecognizer *)centerTapGestureRecognizer { - UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(centerViewControllerTapped:)]; - [tapRecognizer setDelegate:self]; - return tapRecognizer; + if (!_tapGestureRecognizer) { + _tapGestureRecognizer = [[UITapGestureRecognizer alloc] + initWithTarget:self + action:@selector(centerViewControllerTapped:)]; + } + return _tapGestureRecognizer; }