Показать панель вкладок после того, как она скрыта - PullRequest
6 голосов
/ 23 августа 2010

Есть ли способ показать панель вкладок после того, как она была скрыта?

Получил структуру tabbar-nav. Для одной из вкладок мне нужно скрыть панель вкладок для ее представления 2-го и 3-го уровня. Но в то же время мне нужно будет показать его 1-й и 4-й вид.

Пример кода из Elements здесь не совсем применим.

Ответы [ 4 ]

4 голосов
/ 06 апреля 2011

Я нашел довольно хорошее прагматичное решение этой проблемы - увеличьте размер представления UITabBarController, чем это необходимо, чтобы фактический UITabBar был обрезан по экрану.

Предполагая, что представление панели вкладок обычно заполняет его суперпредставление, этот вид вещи должен работать:

CGRect frame = self.tabBarController.view.superview.frame;
if (isHidden)
{
    CGFloat offset = self.tabBarController.tabBar.frame.size.height;
    frame.size.height += offset;
}
self.tabBarController.view.frame = frame;

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

Это может повлиять на производительность, если это вызывает дополнительное ограничение, но пока, похоже, это работает.

1 голос
/ 23 августа 2010

Контроллеры UIViewControllers, которые помещаются в стек навигации, могут делать что-то вроде следующего:

- (void)viewWillAppear:(BOOL)animated {
    self.tabBarController.tabBar.hidden = NO; // Or YES as desired.
}

РЕДАКТИРОВАТЬ: Добавлен дополнительный код ниже, чтобы иметь дело с кадром. Не думаю, что я особенно рекомендую эту идею, поскольку она опирается на внутреннюю структуру представления по умолчанию UITabBarController.

Определите следующую категорию на UITabBarController:

@interface UITabBarController (Extras)
- (void)showTabBar:(BOOL)show;
@end

@implementation UITabBarController (Extras)
- (void)showTabBar:(BOOL)show {
    UITabBar* tabBar = self.tabBar;
    if (show != tabBar.hidden)
        return;
    // This relies on the fact that the content view is the first subview
    // in a UITabBarController's normal view, and so is fragile in the face
    // of updates to UIKit.
    UIView* subview = [self.view.subviews objectAtIndex:0];
    CGRect frame = subview.frame;
    if (show) {
        frame.size.height -= tabBar.frame.size.height;
    } else {
        frame.size.height += tabBar.frame.size.height;
    }
    subview.frame = frame;
    tabBar.hidden = !show;
}
@end

Затем, вместо того, чтобы использовать изменение tabBar.hidden, которое я изначально предлагал, сделайте следующее:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tabBarController showTabBar:NO];
}

Очевидно, что убедиться, что реализация включает определение категории, так что 'showTabBar' известен.

1 голос
/ 23 августа 2010

Вам необходимо реализовать метод делегата

- (BOOL)tabBarController:(UITabBarController *)tabBarController2 shouldSelectViewController:(UIViewController *)viewController

Внутри него вы можете проверить, какой индекс выбран, и показать панель вкладок

if([[tabBarController.viewControllers objectAtIndex:0] isEqual:viewController])// it is first tab
{
      tabBarController.tabBar.hidden = FALSE;
}
0 голосов
/ 30 сентября 2011

Я знаю, что это старый пост, но я думаю, что приведенный ниже код поможет скрыть панель вкладок на контроллере представления, на котором вы его не хотите, и имеет дополнительное преимущество автоматического чтения панели вкладок, когда вы возвращаетесь из этого контроллера представления

UIViewController *hideTabbarViewController = [[UIViewController alloc] init];  
hideTabbarViewController.hidesBottomBarWhenPushed = YES;  
[[self navigationController] hideTabbarViewController animated:YES]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...