Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #import "TabsController.h"
- #import "CustomStyle.h" // Custom fonts
- #import "UIView+Sizes.h" // Helpers to set view sizes
- @interface TabsController()
- @property (nonatomic, retain) IBOutlet UIView *mainMenuView; // Main view for custom tabbar
- @property (nonatomic, retain) IBOutlet UIView *menuSliderView; // Slider view (you drag/touch slider to expand/close menu)
- @property (nonatomic, retain) IBOutletCollection(UIButton) NSArray *menuButtons; // Tab buttons
- @property (nonatomic, assign) BOOL isMenuOpened;
- @end
- @implementation TabsController
- @synthesize mainMenuView = _mainMenuView;
- @synthesize menuSliderView = _menuSliderView;
- @synthesize menuButtons = _menuButtons;
- @synthesize isMenuOpened = _isMenuOpened;
- #pragma mark - Object lifecycle
- - (void) dealloc
- {
- self.mainMenuView = nil;
- self.menuSliderView = nil;
- self.menuButtons = nil;
- [super dealloc];
- }
- #pragma mark - View lifecycle
- - (void)viewWillAppear:(BOOL)animated
- {
- [super viewWillAppear:animated];
- if (self.mainMenuView.superview == nil) {
- // Resize main view, because collapsed menu is smaller than tabbar view
- [[self.view.subviews objectAtIndex:0] setFrame:CGRectMake(0, 0, 320, 480 - self.menuSliderView.height)];
- // Position for menu
- self.mainMenuView.y = self.view.height - self.menuSliderView.height;
- // Add menu over tabbar. Don't forget to hide tabbar in nib file
- [self.view addSubview:self.mainMenuView];
- // Just font customization
- for (UIButton *menuButton in self.menuButtons) {
- menuButton.titleLabel.font = [CustomStyle regularFontWithSize:26];
- }
- // gesture for dragging
- UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(onMenuSliderPan:)];
- panGesture.minimumNumberOfTouches = 1;
- [self.menuSliderView addGestureRecognizer:panGesture];
- [panGesture release];
- // Gesture for tap
- UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMenuSliderTap:)];
- [self.menuSliderView addGestureRecognizer:tapGesture];
- [tapGesture release];
- self.isMenuOpened = NO;
- }
- }
- // Get button for specified tab index
- - (void)selectMenuButtonForIndex:(NSUInteger)idx
- {
- for (NSUInteger i = 0; i < self.menuButtons.count; ++i) {
- UIButton *button = [self.menuButtons objectAtIndex:i];
- button.selected = i == idx;
- }
- }
- #pragma mark - Private
- // Override setting current tab item
- - (void)setSelectedIndex:(NSUInteger)selectedIndex
- {
- [super setSelectedIndex:selectedIndex];
- [self selectMenuButtonForIndex:selectedIndex]; // Set state for custom button associated with selected tab
- [self closeMenu];
- }
- // Animation to expand menu
- - (void)openMenu
- {
- if (self.mainMenuView.y <= self.view.height - self.mainMenuView.height) {
- return;
- }
- [UIView animateWithDuration:0.2 animations:^{
- self.mainMenuView.y = self.view.height - self.mainMenuView.height;
- } completion:^(BOOL finished){
- self.isMenuOpened = YES;
- }];
- }
- // Animation to collapse meny
- - (void)closeMenu
- {
- if (self.mainMenuView.y >= self.view.height - self.menuSliderView.height) {
- return;
- }
- [UIView animateWithDuration:0.2 animations:^{
- self.mainMenuView.y = self.view.height - self.menuSliderView.height;
- } completion:^(BOOL finished){
- self.isMenuOpened = NO;
- }];
- }
- #pragma mark - Actions
- // On tap on button in main menu
- - (IBAction)onMenuItem:(UIButton *)menuButton
- {
- NSUInteger idx = [self.menuButtons indexOfObject:menuButton];
- [self setSelectedIndex:idx];
- }
- // Support for dragging
- - (void)onMenuSliderPan:(UIPanGestureRecognizer *)panGesture
- {
- if (panGesture.state == UIGestureRecognizerStateBegan || panGesture.state == UIGestureRecognizerStateChanged) {
- CGPoint translation = [panGesture translationInView:self.view];
- CGFloat newY = self.mainMenuView.y += translation.y;
- newY = MAX(newY, self.view.height - self.mainMenuView.height);
- newY = MIN(newY, self.view.height - self.menuSliderView.height);
- self.mainMenuView.y = newY;
- [panGesture setTranslation:CGPointZero inView:self.view];
- } else if (panGesture.state == UIGestureRecognizerStateEnded) {
- if (self.isMenuOpened) {
- if (self.mainMenuView.y > (self.view.height - (self.mainMenuView.height / 3) * 2)) {
- [self closeMenu];
- } else {
- [self openMenu];
- }
- } else {
- if (self.mainMenuView.y < (self.view.height - self.mainMenuView.height / 3)) {
- [self openMenu];
- } else {
- [self closeMenu];
- }
- }
- }
- }
- // Support for tap
- - (void)onMenuSliderTap:(UITapGestureRecognizer *)tapGesture
- {
- if (self.isMenuOpened) {
- [self closeMenu];
- } else {
- [self openMenu];
- }
- }
- @end
Add Comment
Please, Sign In to add comment