Как скрыть UITabBar на контроллере UITabBarController, который я не подкласс? - PullRequest
4 голосов
/ 28 сентября 2011

Визуально это то, что я хочу

У меня есть UITabBarController .Я хочу скрыть UITabBar , когда пользователь входит в среднюю вкладку.Средняя вкладка загружает контроллер представления класса B. Это поведение популярного приложения камеры Instagram .Их средняя вкладка загружает полноэкранную камеру.

-------------    -------------    -------------
|     VC    |    |     VC    |    |     VC    |
|    for    |    |    for    |    |    for    |
|     A     |    |     B     |    |     C     |
|           |    |           |    |           |
|------------    |           |    |------------
{ A } B | C |    |           |    | A | B { C }
-------------    -------------    -------------

Предлагаемое решение по всем другим связанным вопросам StackExchange

У нас уже есть десятки вопросов о том, как скрыть UITabBar при нажатии определенного контроллера представления.Общее мнение таково:

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

Моя проблема в том, что я никогда не разделял UITabBarController на подклассы.Я создал это в Интерфейсном Разработчике.Я никогда не нажимаю вручную на свои контроллеры вида, поэтому приведенное выше решение не работает для меня.

Попытка сбоя 1

Внутри моего контроллера среднего вида я включаю hidesBottomBarWhenPushed в конструкторе.Это не имело никакого эффекта.

@implementation B

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.hidesBottomBarWhenPushed = YES;
    }
    return self;
}

Попытка сбоя 2

Я также попытался назначить моего делегата приложения как UITabBarControllerDelegate .Когда UITabBarController уведомляет меня, что вкладка нажата, я включаю hidesBottomBarWhenPushed только для контроллера среднего вида.Также не удалось скрыть UITabBar.

#pragma mark UIApplicationDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [window addSubview:self.rootViewController.view];
    [window makeKeyAndVisible];
    self.rootViewController.delegate = self;
}

#pragma mark UITabBarControllerDelegate

- (void) tabBarController:(UITabBarController *)tabBarController 
didSelectViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[B class]]) {
        viewController.hidesBottomBarWhenPushed = YES;
    } else {
        viewController.hidesBottomBarWhenPushed = NO;
    }
}

1 Ответ

0 голосов
/ 30 сентября 2011
- (void) hidetabbar:(BOOL)hiddenTabBar
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in self.uiTabBarController.view.subviews){
        if([view isKindOfClass:[UITabBar class]]) {

            if (hiddenTabBar) {
                [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];
            } else {
                [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
            }
        } else {
            if (hiddenTabBar) {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
            } else {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
            }
        }
    }
    [UIView commitAnimations];  
    hiddenTabBar = !hiddenTabBar;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...