Skip to content
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

Added pan gesture, tap gesture, swip gesture to the side bar #28

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
48 changes: 48 additions & 0 deletions JTRevealSidebarDemoV2/NewViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ - (void)viewDidLoad
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(revealRightSidebar:)];

self.navigationItem.revealSidebarDelegate = self;

UIPanGestureRecognizer *panRightSideBar = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRightSideBar:)];
[self.view addGestureRecognizer:panRightSideBar];

}

- (void)viewDidUnload
Expand All @@ -48,6 +52,50 @@ - (void)revealRightSidebar:(id)sender {
[self.navigationController setRevealedState:state];
}

- (void)panRightSideBar:(UIPanGestureRecognizer*)panGes {
UIView *revealedView = [self viewForRightSidebar];

revealedView.tag = RIGHT_SIDEBAR_VIEW_TAG;
if (![self.navigationController.view.superview viewWithTag:RIGHT_SIDEBAR_VIEW_TAG]) {
[self.navigationController.view.superview insertSubview:revealedView belowSubview:self.navigationController.view];

}
CGFloat width = CGRectGetWidth(revealedView.frame);
CGPoint translate = [panGes translationInView:self.navigationController.view];
CGRect frame = self.navigationController.view.frame;


CGFloat offsetX = translate.x;
if (self.navigationController.revealedState == JTRevealedStateRight) {
offsetX = -width + translate.x;

}



if (offsetX <= -width) {
offsetX = -width;
}
else if(offsetX >= 0) {
offsetX = 0;
}





frame.origin.x = offsetX;
self.navigationController.view.frame = frame;

if (panGes.state == UIGestureRecognizerStateEnded) {
[self revealRightSidebar:nil];
}
else if (panGes.state == UIGestureRecognizerStateCancelled) {
[self revealRightSidebar:nil];
}

}


#pragma mark UITableViewDatasource

Expand Down
79 changes: 79 additions & 0 deletions JTRevealSidebarDemoV2/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ - (void)viewDidLoad
[self.view addSubview:pushButton];

self.navigationItem.revealSidebarDelegate = self;


UIPanGestureRecognizer *panSideBar = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panSideBar:)];
[self.view addGestureRecognizer:panSideBar];
}

- (void)viewDidUnload
Expand Down Expand Up @@ -118,6 +122,81 @@ - (void)revealRightSidebar:(id)sender {
[self.navigationController toggleRevealState:JTRevealedStateRight];
}



- (void)panSideBar:(UIPanGestureRecognizer*)panGes {

UIView *revealedView = [self viewForLeftSidebar];

CGFloat width = CGRectGetWidth(revealedView.frame);
CGPoint translate = [panGes translationInView:self.navigationController.view];
CGRect frame = self.navigationController.view.frame;
NSLog(@"%f,%f",translate.x,translate.y);



CGFloat offsetX = translate.x;
if (self.navigationController.revealedState == JTRevealedStateLeft) {
offsetX = frame.size.width + translate.x - (frame.size.width - width);

}


if (offsetX <= -width) {
offsetX = -width;
}
else if(offsetX >= width) {
offsetX = width;
}



if (offsetX >= 0) {
revealedView.tag = LEFT_SIDEBAR_VIEW_TAG;
if (![self.navigationController.view.superview viewWithTag:LEFT_SIDEBAR_VIEW_TAG]) {
[self.navigationController.view.superview insertSubview:revealedView belowSubview:self.navigationController.view];
}
[[self.navigationController.view.superview viewWithTag:RIGHT_SIDEBAR_VIEW_TAG] removeFromSuperview];


}
else {
UIView *revealedRightView = [self viewForRightSidebar];

revealedRightView.tag = RIGHT_SIDEBAR_VIEW_TAG;
if (![self.navigationController.view.superview viewWithTag:RIGHT_SIDEBAR_VIEW_TAG]) {
[self.navigationController.view.superview insertSubview:revealedRightView belowSubview:self.navigationController.view];
}
[[self.navigationController.view.superview viewWithTag:LEFT_SIDEBAR_VIEW_TAG] removeFromSuperview];

}




frame.origin.x = offsetX;
self.navigationController.view.frame = frame;

if (panGes.state == UIGestureRecognizerStateEnded) {

if (offsetX >= 0) {
[self revealLeftSidebar:nil];
}
else {
[self revealRightSidebar:nil];
}
}
else if (panGes.state == UIGestureRecognizerStateCancelled) {

if (offsetX >= 0) {
[self revealLeftSidebar:nil];
}
else {
[self revealRightSidebar:nil];
}
}
}

- (void)pushNewViewController:(id)sender {
NewViewController *controller = [[NewViewController alloc] init];
controller.view.backgroundColor = [UIColor whiteColor];
Expand Down
2 changes: 2 additions & 0 deletions JTRevealSidebarV2/UIViewController+JTRevealSidebarV2.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
*/

#import <UIKit/UIKit.h>
#define LEFT_SIDEBAR_VIEW_TAG 10000
#define RIGHT_SIDEBAR_VIEW_TAG 10001

typedef enum {
JTRevealedStateNo,
Expand Down
148 changes: 134 additions & 14 deletions JTRevealSidebarV2/UIViewController+JTRevealSidebarV2.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@
#import "UINavigationItem+JTRevealSidebarV2.h"
#import "JTRevealSidebarV2Delegate.h"
#import <objc/runtime.h>
UITapGestureRecognizer *tapGesForLeftSidebar;
UISwipeGestureRecognizer *swipeGesForLeftSidebar;
UIPanGestureRecognizer *panGesForLeftSidebar;

UITapGestureRecognizer *tapGesForRightSidebar;
UISwipeGestureRecognizer *swipeGesForRightSidebar;
UIPanGestureRecognizer *panGesForRightSidebar;


@interface UIViewController (JTRevealSidebarV2Private)

Expand Down Expand Up @@ -72,6 +80,76 @@ - (void)setRevealedState:(JTRevealedState)revealedState {
}
}

- (void)closeLeftSideBar:(id)sender {
[self toggleRevealState:JTRevealedStateLeft];
}

- (void)panLeftSideBar:(UIPanGestureRecognizer*)ges {
id <JTRevealSidebarV2Delegate> delegate = [self selectedViewController].navigationItem.revealSidebarDelegate;

if ( ! [delegate respondsToSelector:@selector(viewForLeftSidebar)]) {
return;
}
UIView *revealedView = [delegate viewForLeftSidebar];
CGFloat width = CGRectGetWidth(revealedView.frame);
CGPoint translate = [ges translationInView:self.view];
CGRect frame = self.view.frame;

CGFloat offsetX = frame.size.width + translate.x - (frame.size.width - width);
if (offsetX <= 0) {
offsetX = 0.f;
}
else if(offsetX >= width) {
offsetX = width;
}
frame.origin.x = offsetX;
self.view.frame = frame;

if (ges.state == UIGestureRecognizerStateEnded) {
[self toggleRevealState:JTRevealedStateLeft];
}
else if (ges.state == UIGestureRecognizerStateCancelled) {
[self toggleRevealState:JTRevealedStateLeft];
}
}

- (void)closeRightSideBar:(id)sender {
[self toggleRevealState:JTRevealedStateRight];
}

- (void)panRightSideBar:(UIPanGestureRecognizer*)ges {
id <JTRevealSidebarV2Delegate> delegate = [self selectedViewController].navigationItem.revealSidebarDelegate;

if ( ! [delegate respondsToSelector:@selector(viewForRightSidebar)]) {
return;
}
UIView *revealedView = [delegate viewForRightSidebar];
CGFloat width = CGRectGetWidth(revealedView.frame);
CGPoint translate = [ges translationInView:self.view];
CGRect frame = self.view.frame;

CGFloat offsetX = -width + translate.x;




if (offsetX <= -width) {
offsetX = -width;
}
else if(offsetX >= 0) {
offsetX = 0;
}
frame.origin.x = offsetX;
self.view.frame = frame;

if (ges.state == UIGestureRecognizerStateEnded) {
[self toggleRevealState:JTRevealedStateRight];
}
else if (ges.state == UIGestureRecognizerStateCancelled) {
[self toggleRevealState:JTRevealedStateRight];
}
}

- (JTRevealedState)revealedState {
return (JTRevealedState)[objc_getAssociatedObject(self, &revealedStateKey) intValue];
}
Expand Down Expand Up @@ -114,7 +192,6 @@ - (void)toggleRevealState:(JTRevealedState)openingState {

@end

#define SIDEBAR_VIEW_TAG 10000

@implementation UIViewController (JTRevealSidebarV2Private)

Expand All @@ -129,6 +206,20 @@ - (void)animationDidStop2:(NSString *)animationID finished:(NSNumber *)finished
if ([animationID isEqualToString:@"hideSidebarView"]) {
// Remove the sidebar view after the sidebar closes.
UIView *view = [self.view.superview viewWithTag:(int)context];
[self.view removeGestureRecognizer:tapGesForLeftSidebar];
tapGesForLeftSidebar = nil;
[self.view removeGestureRecognizer:swipeGesForLeftSidebar];
swipeGesForLeftSidebar = nil;
[self.view removeGestureRecognizer:panGesForLeftSidebar];
panGesForLeftSidebar = nil;

[self.view removeGestureRecognizer:tapGesForRightSidebar];
tapGesForRightSidebar = nil;
[self.view removeGestureRecognizer:swipeGesForRightSidebar];
swipeGesForRightSidebar = nil;
[self.view removeGestureRecognizer:panGesForRightSidebar];
panGesForRightSidebar = nil;

[view removeFromSuperview];
}

Expand All @@ -149,23 +240,37 @@ - (void)revealLeftSidebar:(BOOL)showLeftSidebar {
}

UIView *revealedView = [delegate viewForLeftSidebar];
revealedView.tag = SIDEBAR_VIEW_TAG;
revealedView.tag = LEFT_SIDEBAR_VIEW_TAG;
CGFloat width = CGRectGetWidth(revealedView.frame);

if (showLeftSidebar) {
[self.view.superview insertSubview:revealedView belowSubview:self.view];
if (![self.view.superview viewWithTag:LEFT_SIDEBAR_VIEW_TAG]) {
[self.view.superview insertSubview:revealedView belowSubview:self.view];
}
tapGesForLeftSidebar = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeLeftSideBar:)];
tapGesForLeftSidebar.numberOfTapsRequired = 1;
tapGesForLeftSidebar.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:tapGesForLeftSidebar];

swipeGesForLeftSidebar = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(closeLeftSideBar:)];
swipeGesForLeftSidebar.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeGesForLeftSidebar];


panGesForLeftSidebar = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panLeftSideBar:)];
[self.view addGestureRecognizer:panGesForLeftSidebar];
[UIView beginAnimations:@"" context:nil];
// self.view.transform = CGAffineTransformTranslate([self baseTransform], width, 0);

self.view.frame = CGRectOffset(self.view.frame, width, 0);

self.view.frame = CGRectOffset(self.view.bounds, width, 0);
} else {
[UIView beginAnimations:@"hideSidebarView" context:(void *)SIDEBAR_VIEW_TAG];
// self.view.transform = CGAffineTransformTranslate([self baseTransform], -width, 0);
[UIView beginAnimations:@"hideSidebarView" context:(void *)LEFT_SIDEBAR_VIEW_TAG];
// self.view.transform = CGAffineTransformTranslate([self baseTransform], -width, 0);

self.view.frame = CGRectOffset(self.view.frame, -width, 0);
self.view.frame = CGRectOffset(self.view.bounds, 0, 0);
}


[UIView setAnimationDidStopSelector:@selector(animationDidStop2:finished:context:)];
[UIView setAnimationDelegate:self];
Expand All @@ -185,21 +290,36 @@ - (void)revealRightSidebar:(BOOL)showRightSidebar {
}

UIView *revealedView = [delegate viewForRightSidebar];
revealedView.tag = SIDEBAR_VIEW_TAG;
revealedView.tag = RIGHT_SIDEBAR_VIEW_TAG;
CGFloat width = CGRectGetWidth(revealedView.frame);
revealedView.frame = (CGRect){self.view.frame.size.width - width, revealedView.frame.origin.y, revealedView.frame.size};

if (showRightSidebar) {
[self.view.superview insertSubview:revealedView belowSubview:self.view];

if (![self.view.superview viewWithTag:RIGHT_SIDEBAR_VIEW_TAG]) {
[self.view.superview insertSubview:revealedView belowSubview:self.view];
}

tapGesForRightSidebar = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeRightSideBar:)];
tapGesForRightSidebar.numberOfTapsRequired = 1;
tapGesForRightSidebar.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:tapGesForRightSidebar];

swipeGesForRightSidebar = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(closeRightSideBar:)];
swipeGesForRightSidebar.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeGesForRightSidebar];


panGesForRightSidebar = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRightSideBar:)];
[self.view addGestureRecognizer:panGesForRightSidebar];

[UIView beginAnimations:@"" context:nil];
// self.view.transform = CGAffineTransformTranslate([self baseTransform], -width, 0);

self.view.frame = CGRectOffset(self.view.frame, -width, 0);
self.view.frame = CGRectOffset(self.view.bounds, -width, 0);
} else {
[UIView beginAnimations:@"hideSidebarView" context:(void *)SIDEBAR_VIEW_TAG];
[UIView beginAnimations:@"hideSidebarView" context:(void *)RIGHT_SIDEBAR_VIEW_TAG];
// self.view.transform = CGAffineTransformTranslate([self baseTransform], width, 0);
self.view.frame = CGRectOffset(self.view.frame, width, 0);
self.view.frame = CGRectOffset(self.view.bounds, 0, 0);
}

[UIView setAnimationDidStopSelector:@selector(animationDidStop2:finished:context:)];
Expand Down