iOS-как скрыть/показать панель вкладок UITabBarController с анимацией?

У меня есть вопрос о панели вкладок UITabBarController в iOS.

Я использую UITabBarController для отображения нескольких представлений, но я хочу, чтобы представления отображались на как можно большем экране. Можно ли скрыть панель вкладок, чтобы она обычно не отображалась, пока пользователь не коснется экрана, тогда панель вкладок (с анимацией) появится внизу. Затем, через несколько секунд, если ничего не делать, панель вкладок снова исчезнет, ​​так что вид снова станет полноэкранным?


person JusmanX    schedule 04.04.2011    source источник


Ответы (3)


Вот как вы это показываете

- (void)showTabBar:(UITabBarController *)tabbarcontroller
{
    tabbarcontroller.tabBar.hidden = NO;
    [UIView animateWithDuration:kAnimationInterval animations:^{
        for (UIView *view in tabbarcontroller.view.subviews) {
            if ([view isKindOfClass:[UITabBar class]]) {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y-49.f, view.frame.size.width, view.frame.size.height)];
            }
            else {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height-49.f)];
            }
        }
    } completion:^(BOOL finished) {
        //do smth after animation finishes
    }];
}

...и вот как ты это прячешь

- (void)hideTabBar:(UITabBarController *)tabbarcontroller
{
    [UIView animateWithDuration:kAnimationInterval animations:^{
        for (UIView *view in tabbarcontroller.view.subviews) {
            if ([view isKindOfClass:[UITabBar class]]) {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y+49.f, view.frame.size.width, view.frame.size.height)];
            }
            else {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height+49.f)];
            }
        }
    } completion:^(BOOL finished) {
        //do smth after animation finishes
        tabbarcontroller.tabBar.hidden = YES;
    }];
}
person Borut Tomazin    schedule 19.09.2012
comment
Спасибо, этот ответ помог мне. :) Я также установил для свойства hidden панели вкладок значение YES в блоке завершения. Это полезно для определения необходимости отображения панели вкладок при появлении представления. - person James; 12.10.2012
comment
Ваш исходный код уже был очень полезен, но поскольку вы решили его обновить, для -showTabBar: свойство hidden должно быть установлено в NO перед блоком анимации (а не в блоке завершения). В противном случае эффект будет выглядеть очень странно. - person James; 13.10.2012

С принятым ответом в iOS 7, когда вы скрываете панель вкладок и снова показываете ее, размер неверен. Этот код дает лучший результат:

- (void) toggleTabBar: (UITabBar *)tabBar view: (UIView*) view {

    tabBar.hidden = NO;

    [UIView animateWithDuration:0.5 animations:^{
            if (hiddenTabBar) {
                tabBar.center = CGPointMake(tabBar.center.x, self.view.window.bounds.size.height-tabBar.bounds.size.height/2);
            }
            else {
                tabBar.center = CGPointMake(tabBar.center.x, self.view.window.bounds.size.height+tabBar.bounds.size.height);
            }

        } completion:^(BOOL finished) {
            hiddenTabBar = !hiddenTabBar;
            tabBar.hidden = hiddenTabBar;
        }];
}
person José Manuel Sánchez    schedule 16.09.2014

Не думайте, что это сработает в Apple UIGuidelines. Виды, которые вы используете, рисуются над панелью вкладок, поэтому, если вы их уберете, там ничего не будет.

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

person Hobbes the Tige    schedule 04.04.2011