Guest User

Untitled

a guest
Dec 12th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.91 KB | None | 0 0
  1. #import "TabsController.h"
  2.  
  3. #import "CustomStyle.h" // Custom fonts
  4. #import "UIView+Sizes.h" // Helpers to set view sizes
  5.  
  6. @interface TabsController()
  7. @property (nonatomic, retain) IBOutlet UIView *mainMenuView; // Main view for custom tabbar
  8. @property (nonatomic, retain) IBOutlet UIView *menuSliderView; // Slider view (you drag/touch slider to expand/close menu)
  9. @property (nonatomic, retain) IBOutletCollection(UIButton) NSArray *menuButtons; // Tab buttons
  10.  
  11. @property (nonatomic, assign) BOOL isMenuOpened;
  12. @end
  13.  
  14. @implementation TabsController
  15.  
  16. @synthesize mainMenuView = _mainMenuView;
  17. @synthesize menuSliderView = _menuSliderView;
  18. @synthesize menuButtons = _menuButtons;
  19.  
  20. @synthesize isMenuOpened = _isMenuOpened;
  21.  
  22. #pragma mark - Object lifecycle
  23.  
  24. - (void) dealloc
  25. {
  26. self.mainMenuView = nil;
  27. self.menuSliderView = nil;
  28. self.menuButtons = nil;
  29. [super dealloc];
  30. }
  31.  
  32. #pragma mark - View lifecycle
  33.  
  34. - (void)viewWillAppear:(BOOL)animated
  35. {
  36. [super viewWillAppear:animated];
  37.  
  38. if (self.mainMenuView.superview == nil) {
  39. // Resize main view, because collapsed menu is smaller than tabbar view
  40. [[self.view.subviews objectAtIndex:0] setFrame:CGRectMake(0, 0, 320, 480 - self.menuSliderView.height)];
  41.  
  42. // Position for menu
  43. self.mainMenuView.y = self.view.height - self.menuSliderView.height;
  44. // Add menu over tabbar. Don't forget to hide tabbar in nib file
  45. [self.view addSubview:self.mainMenuView];
  46.  
  47. // Just font customization
  48. for (UIButton *menuButton in self.menuButtons) {
  49. menuButton.titleLabel.font = [CustomStyle regularFontWithSize:26];
  50. }
  51.  
  52. // gesture for dragging
  53. UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(onMenuSliderPan:)];
  54. panGesture.minimumNumberOfTouches = 1;
  55. [self.menuSliderView addGestureRecognizer:panGesture];
  56. [panGesture release];
  57.  
  58. // Gesture for tap
  59. UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMenuSliderTap:)];
  60. [self.menuSliderView addGestureRecognizer:tapGesture];
  61. [tapGesture release];
  62.  
  63. self.isMenuOpened = NO;
  64. }
  65. }
  66.  
  67. // Get button for specified tab index
  68. - (void)selectMenuButtonForIndex:(NSUInteger)idx
  69. {
  70. for (NSUInteger i = 0; i < self.menuButtons.count; ++i) {
  71. UIButton *button = [self.menuButtons objectAtIndex:i];
  72. button.selected = i == idx;
  73. }
  74. }
  75.  
  76. #pragma mark - Private
  77.  
  78. // Override setting current tab item
  79. - (void)setSelectedIndex:(NSUInteger)selectedIndex
  80. {
  81. [super setSelectedIndex:selectedIndex];
  82. [self selectMenuButtonForIndex:selectedIndex]; // Set state for custom button associated with selected tab
  83. [self closeMenu];
  84. }
  85.  
  86. // Animation to expand menu
  87. - (void)openMenu
  88. {
  89. if (self.mainMenuView.y <= self.view.height - self.mainMenuView.height) {
  90. return;
  91. }
  92. [UIView animateWithDuration:0.2 animations:^{
  93. self.mainMenuView.y = self.view.height - self.mainMenuView.height;
  94. } completion:^(BOOL finished){
  95. self.isMenuOpened = YES;
  96. }];
  97. }
  98.  
  99. // Animation to collapse meny
  100. - (void)closeMenu
  101. {
  102. if (self.mainMenuView.y >= self.view.height - self.menuSliderView.height) {
  103. return;
  104. }
  105. [UIView animateWithDuration:0.2 animations:^{
  106. self.mainMenuView.y = self.view.height - self.menuSliderView.height;
  107. } completion:^(BOOL finished){
  108. self.isMenuOpened = NO;
  109. }];
  110. }
  111.  
  112. #pragma mark - Actions
  113.  
  114. // On tap on button in main menu
  115. - (IBAction)onMenuItem:(UIButton *)menuButton
  116. {
  117. NSUInteger idx = [self.menuButtons indexOfObject:menuButton];
  118. [self setSelectedIndex:idx];
  119. }
  120.  
  121. // Support for dragging
  122. - (void)onMenuSliderPan:(UIPanGestureRecognizer *)panGesture
  123. {
  124. if (panGesture.state == UIGestureRecognizerStateBegan || panGesture.state == UIGestureRecognizerStateChanged) {
  125. CGPoint translation = [panGesture translationInView:self.view];
  126. CGFloat newY = self.mainMenuView.y += translation.y;
  127. newY = MAX(newY, self.view.height - self.mainMenuView.height);
  128. newY = MIN(newY, self.view.height - self.menuSliderView.height);
  129. self.mainMenuView.y = newY;
  130. [panGesture setTranslation:CGPointZero inView:self.view];
  131. } else if (panGesture.state == UIGestureRecognizerStateEnded) {
  132. if (self.isMenuOpened) {
  133. if (self.mainMenuView.y > (self.view.height - (self.mainMenuView.height / 3) * 2)) {
  134. [self closeMenu];
  135. } else {
  136. [self openMenu];
  137. }
  138. } else {
  139. if (self.mainMenuView.y < (self.view.height - self.mainMenuView.height / 3)) {
  140. [self openMenu];
  141. } else {
  142. [self closeMenu];
  143. }
  144. }
  145. }
  146. }
  147.  
  148. // Support for tap
  149. - (void)onMenuSliderTap:(UITapGestureRecognizer *)tapGesture
  150. {
  151. if (self.isMenuOpened) {
  152. [self closeMenu];
  153. } else {
  154. [self openMenu];
  155. }
  156. }
  157.  
  158. @end
Add Comment
Please, Sign In to add comment