-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathHamburgerMenuController.m
90 lines (74 loc) · 3.17 KB
/
HamburgerMenuController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//
// HamburgerMenuController.m
// iGenomics
//
// Created by Stuckinaboot Inc. on 8/8/14.
//
//
#import "HamburgerMenuController.h"
@interface HamburgerMenuController ()
@end
@implementation HamburgerMenuController
@synthesize menuOpen;
- (id)initWithCentralController:(UIViewController *)centralController andSlideOutController:(UIViewController *)slideOutController {
self = [super init];
mainController = centralController;
sideController = slideOutController;
panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panOccurred:)];
[mainController.view addGestureRecognizer:panRecognizer];
[mainController addChildViewController:sideController];
sideController.view.frame = CGRectMake(0, 0, sideController.view.frame.size.width, sideController.view.frame.size.height);
sideController.view.center = CGPointMake(-sideController.view.bounds.size.width/2, sideController.view.center.y);
sideController.view.hidden = YES;
[mainController.view addSubview:sideController.view];
[mainController.view sendSubviewToBack:sideController.view];
[sideController didMoveToParentViewController:mainController];
return self;
}
- (IBAction)panOccurred:(id)sender {
UIPanGestureRecognizer *recognizer = (UIPanGestureRecognizer*)sender;
CGPoint pt = [recognizer translationInView:mainController.view];
if (menuOpen) {
CGRect rect = mainController.view.bounds;
if (rect.origin.x-pt.x >= -sideController.view.bounds.size.width && rect.origin.x-pt.x <= 0)
mainController.view.bounds = CGRectMake(rect.origin.x-pt.x, rect.origin.y, rect.size.width, rect.size.height);
if (recognizer.state == UIGestureRecognizerStateEnded) {
if (rect.origin.x > -sideController.view.bounds.size.width && pt.x < 0) {
[self closeHamburgerMenu];
}
else {
[self openHamburgerMenu];
}
}
}
}
- (void)openHamburgerMenu {
CGRect bounds = mainController.view.bounds;
float width = sideController.view.bounds.size.width;
sideController.view.hidden = NO;
[UIView animateWithDuration:kHamburgerMenuSlideOutDuration animations:^{
mainController.view.bounds = CGRectMake(-width, bounds.origin.y, bounds.size.width, bounds.size.height);
sideController.view.center = CGPointMake(-width/2, sideController.view.center.y);
} completion:^(BOOL finished){
menuOpen = YES;
}];
}
- (void)closeHamburgerMenu {
CGRect bounds = mainController.view.bounds;
[UIView animateWithDuration:kHamburgerMenuSlideOutDuration animations:^{
mainController.view.bounds = CGRectMake(0, bounds.origin.y, bounds.size.width, bounds.size.height);
} completion:^(BOOL finished){
sideController.view.hidden = YES;
menuOpen = NO;
}];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end