Skip to content

Positioning mode and pan gesture delegate #178

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions MFSideMenu/MFSideMenuContainerViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -31,6 +36,13 @@ typedef enum {
MFSideMenuStateEventMenuDidClose // the menu finished closing
} MFSideMenuStateEvent;

@protocol MFSideMenuContainerViewControllerPanProtocol <NSObject>

@optional
- (void)mfSideMenuPanGestureRecognizerDidPanWithOffset:(CGFloat)offset;

@end


@interface MFSideMenuContainerViewController : UIViewController<UIGestureRecognizerDelegate>

Expand All @@ -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;
Expand All @@ -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 <MFSideMenuContainerViewControllerPanProtocol> panGestureDelegate;

- (void)toggleLeftSideMenuCompletion:(void (^)(void))completion;
- (void)toggleRightSideMenuCompletion:(void (^)(void))completion;
Expand Down
43 changes: 35 additions & 8 deletions MFSideMenu/MFSideMenuContainerViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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;
}


Expand Down Expand Up @@ -759,6 +772,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){
Expand Down