Скрытие UITabBar при нажатии на UIView - PullRequest
32 голосов
/ 24 марта 2009

У меня есть UITabBarController, где контроллером представления по умолчанию является UINavigationController. Я хочу иметь возможность скрыть UITabBar UITabBarController, когда я выдвигаю определенный вид в UINavigationController.

Я пытался добавить:

delegate.tabBarController.hidesBottomBarWhenPushed = YES;

в моем UINavigationController до того, как я нажму на вид, но, похоже, это не сработает.

Любые советы о том, что я должен делать, или если это вообще возможно? Заранее спасибо!

Ответы [ 8 ]

97 голосов
/ 09 ноября 2009

Это лучше:

viewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:viewController animated:YES];

Вы должны установить hidesBottomBarWhenPressed = YES на контроллере, который вы собираетесь выдвинуть в представление ...

4 голосов
/ 01 марта 2015

при работе с раскадровкой его легко настроить контроллер представления, который будет скрывать панель вкладок при нажатии, на контроллере представления назначения просто установите этот флажок:
enter image description here

3 голосов
/ 07 января 2012

Я испробовал большинство предложенных решений. В конце концов, никто из них не работал для меня.

hideTabBarWhenPhed скрывает панель вкладок не только для контроллера представления, который помещается дальше, но и для всех контроллеров представления, которые помещаются внутрь. Для тех, кого я хотел, чтобы контроллер панели вкладок снова появился.

Решение Orafaelreis (см. Выше), похоже, подходит больше всего. Но его попытка работала только для строгой ориентации портрета, даже для перевернутого. Поэтому мне пришлось это исправить. Вот что я наконец получил:

#define kTabBarHeight               49 // This may be different on retina screens. Frankly, I have not yet tried.

- (void) hideTabBar:(BOOL)hide {

    // fetch the app delegate
    AppDelegate         *delegate   = [[UIApplication sharedApplication] delegate];

    // get the device coordinates
    CGRect              bounds      = [UIScreen mainScreen].bounds;
    float               width;
    float               height;

    // Apparently the tab bar controller's view works with device coordinates  
    // and not with normal view/sub view coordinates
    // Therefore the following statement works for all orientations. 
    width                   = bounds.size.width;
    height                  = bounds.size.height;

    if (hide) {

        // The tab bar should be hidden too. 
        // Otherwise it may flickr up a moment upon rotation or 
        // upon return from detail view controllers. 
        [self.tabBarController.tabBar setHidden:YES];

        // Hiding alone is not sufficient. Hiding alone would leave us with an unusable black
        // bar on the bottom of the size of the tab bar. 
        // We need to enlarge the tab bar controller's view by the height of the tab bar. 
        // Doing so the tab bar, although hidden, appears just beneath the screen. 
        // As the tab bar controller's view works in device coordinations, we need to enlarge 
        // it by the tab bar height in the appropriate direction (height in portrait and width in landscape)
        // and in reverse/upside down orientation we need to shift the area's origin beyond zero. 
        switch (delegate.tabBarController.interfaceOrientation) {
            case UIInterfaceOrientationPortrait:
                // Easy going. Just add the space on the bottom.
                [self.tabBarController.view setFrame:CGRectMake(0,0,width,height+kTabBarHeight)];
                break;

            case UIInterfaceOrientationPortraitUpsideDown:
                // The bottom is now up! Add the appropriate space and shift the rect's origin to y = -49
                [self.tabBarController.view setFrame:CGRectMake(0,-kTabBarHeight,width,height+kTabBarHeight)];
                break;

            case UIInterfaceOrientationLandscapeLeft:
                // Same as Portrait but add the space to the with but the height
                [self.tabBarController.view setFrame:CGRectMake(0,0,width+kTabBarHeight,height)];
                break;

            case UIInterfaceOrientationLandscapeRight:
                // Similar to Upside Down: Add the space and shift the rect. Just use x and with this time
                [self.tabBarController.view setFrame:CGRectMake(0-kTabBarHeight,0,width+kTabBarHeight,height)];
                break;

            default:
                break;
        }
    } else {
        // reset everything to its original state. 
        [self.tabBarController.view setFrame:CGRectMake(0,0,width,height)];
        [self.tabBarController.tabBar setHidden:NO];
    }

    return; 
}


- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

    // It is important to call this method at all and to call it here and not in willRotateToInterfaceOrientation
    // Otherwise the tab bar will re-appear. 
    [self hideTabBar:YES];

    // You may want to re-arrange any other views according to the new orientation
    // You could, of course, utilize willRotateToInterfaceOrientation instead for your subViews. 
}

- (void)viewWillAppear: (BOOL)animated { 

    // In my app I want to hide the status bar and navigation bar too. 
    // You may not want to do that. If so then skip the next two lines. 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

    [self hideTabBar: YES];

    // You may want to re-arrange your subviews here. 
    // Orientation may have changed while detail view controllers were visible. 
    // This method is called upon return from pushed and pulled view controllers.   

    return;
}

- (void)viewWillDisappear: (BOOL)animated {     

    // This method is called while this view controller is pulled
    // or when a sub view controller is pushed and becomes visible
    // Therefore the original settings for the tab bar, navigation bar and status bar need to be re-instated

    [self hideTabBar:NO];

    // If you did not change the appearance of the navigation and status bar in viewWillAppear,
    // then you can skip the next two statements too. 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];

    return;
}

Встроенные комментарии должны объяснять причины каждого утверждения. Хотя могут быть более разумные способы его кодирования.

Существует один побочный эффект в сочетании с сокрытием строки состояния и панели навигации, которые я не хочу скрывать от вас, ребята. 1. При возврате из этого контроллера навигации к вызывающему навигационному контроллеру строка состояния и панель навигации на вызывающем контроллере перекрываются, пока устройство не будет повернуто один раз или пока соответствующая вкладка не будет выбрана снова после того, как другая вкладка окажется впереди. 2. Когда вызывающий контроллер представления является табличным представлением и когда устройство находится в горизонтальном режиме при возврате к таблице, тогда таблица отображается в соответствующей ориентации для альбомной ориентации, но она размещается так, как если бы она была портретной. Верхний левый угол в порядке, но некоторые ячейки таблицы плюс панель вкладок скрыты под экраном. На правой стороне есть свободное место. Это тоже можно исправить, повернув устройство снова.

Я буду держать вас в курсе, как только найду решения для этих мелких, но неприятных ошибок.

3 голосов
/ 13 декабря 2011

Я выяснил, как решить эту проблему, я столкнулся с той же проблемой, но Apple также рассказывает нам, как это сделать, в образце под названием: «Элементы» (http://developer.apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html)

См. Функцию ниже, чтобы узнать, как это сделать, добавьте это к функции инициализации представления, которое вы хотите вставить!

-(id) init { 
    if(self = [super init]) { 
        self.hidesBottomBarWhenPushed = YES; 
    } 
    return self; 
}

Он автоматически скрывает панель вкладок, как приложение для фотографий на вашем iphone. И когда вы вернетесь назад, родительский вид просто покажет панель вкладок снова.

Удачи

2 голосов
/ 02 февраля 2011

Вот как вы можете заставить это работать:

В Application Delegate вы создаете UITabBarController. Затем вы создаете UINavigationController с его корневым контроллером в качестве контроллера представления, который вы хотите на конкретной вкладке. Затем вставьте UINavigationController в массив " viewControllers " UITabBarController. вот так:

ViewControllerForTab1 *tab1Controller = [[ViewControllerForTab1 alloc] initWithNibName:@"ViewControllerForTab1"];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tab1Controller];

[tab1Controller release];


UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = [NSArray arrayWithObjects: navController, nil];

[navController release];


[self.window addSubView:tabBarController.view];

Таким образом, вы можете установить свойство "hidesBottomBarWhenPushed" равным "YES" в любом контроллере представления внутри этого UINavigationController, и оно будет скрывать UITabBar.

Надеюсь, это поможет!

1 голос
/ 02 декабря 2011

Я приведу здесь свое решение для этого:

#define FRAME_HIDDEN CGRectMake(0, 0, 768, 1073) //1073 = 1024 (screen) + 49 (UITabBar) 
#define FRAME_APPEAR CGRectMake(0, 0, 768,1024)

-(void) setHidden: (BOOL) hidden{
    CGRect frame = (hidden)? FRAME_HIDDEN : FRAME_APPEAR;
    [self.tabBarController.view setFrame:frame];
    [self.tabBarController.tabBar setHidden:hidden];
}

Вызывает метод setHidden там, где он вам нужен! Я использую это и 'Singleton Pattern', тогда мои подпредставления могут скрыть UITabBar в его Superview

0 голосов
/ 24 мая 2017

в первом UIViewController "FirstItemViewController"

 @IBAction func pushToControllerAction(sender: AnyObject) {
     self.hidesBottomBarWhenPushed = true
     self.performSegueWithIdentifier("nextController", sender: self)
 }

в следующем UIViewController "ExampleViewController" `

 override func willMoveToParentViewController(parent: UIViewController?) {
         if parent == nil {
             var viewControllers = self.navigationController!.viewControllers
             if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstItemViewController.self)) {
                 (viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false
             }
         }
 }

Посмотрите на этот ответ https://stackoverflow.com/a/36148064/3078925

0 голосов
/ 24 марта 2009

Оказывается, что если вы установите вид hidesBottomBarWhenPushed:YES, то он скрывает панель, когда вид появляется (дух с моей стороны). Я назначил его на UITabBarController, что не имеет особого смысла, когда вы об этом думаете.

[self.view hidesBottomBarWhenPushed:YES];
[super pushViewController:viewController animated:animated];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...