Подтвердить что ты не робот

Скрытие tabBar, показывающее черную полосу в Ios7

Я использую этот код, чтобы скрыть TabBar:

self.tabBarController.tabBar.hidden=YES;

Я скрываю tabBarController в своем проекте. но он показывает черную полосу в нижней части окна в Ios7.Когда я возвращаюсь к тому же виду, это выглядит хорошо. Любая помощь будет оценена.

4b9b3361

Ответ 1

ПРИМЕЧАНИЕ. Это решение только для iOS6 и 7.

В iOS 7, чтобы расширить зону с интерактивным доступом и скрыть черную полосу на месте скрытого UITabBar, вы должны включить опцию "Расширить края - под непрозрачными барами" для вас UIViewController.

Extend Edges - Under Opaque Bars option

Или вы можете установить это свойство программно:

[self setExtendedLayoutIncludesOpaqueBars: YES]

Вот пример кода, который скрывает или перемещает TabBar для iOS 6/7:

UITabBarController *bar = [self tabBarController];
if ([self respondsToSelector:@selector(setExtendedLayoutIncludesOpaqueBars:)]) {
    //iOS 7 - hide by property
    NSLog(@"iOS 7");
    [self setExtendedLayoutIncludesOpaqueBars:YES];
    bar.tabBar.hidden = YES;
} else {
    //iOS 6 - move TabBar off screen
    NSLog(@"iOS 6");
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float height = screenRect.size.height;
    [self moveTabBarToPosition:height];
}

//Moving the tab bar and its subviews offscreen so that top is at position y
-(void)moveTabBarToPosition:(int)y {

    self.tabBarController.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.size.height);

    for(UIView *view in self.tabBarController.view.subviews) {
        if ([view isKindOfClass:[UITabBar class]]) {
            [view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)];
        } else {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)];
            view.backgroundColor = [UIColor blackColor];
        }
    }
}

Функция перемещения экранной панели вкладки получена из этого сообщения.

Ответ 2

Следующий код работает для меня

- (void)showTabBar {
[self.tabBar setTranslucent:NO];
[self.tabBar setHidden:NO];
}

- (void)hideTabBar {
    [self.tabBar setTranslucent:YES];
    [self.tabBar setHidden:YES];
}

Ответ 3

Попробуйте следующее:

- (BOOL)hidesBottomBarWhenPushed {
     return YES;
}

Ответ 4

У меня возникли проблемы при использовании UINavigationController:

Здесь мое решение, которое работает для iOS 7 и UINavigationControllers:

HeaderFile

@interface UITabBarController (HideTabBar)
- (void)setHideTabBar:(BOOL)hide animated:(BOOL)animated;
@end

Реализация

#import "UITabBarController+HideTabBar.h"

@implementation UITabBarController (HideTabBar)

- (void)setHideTabBar:(BOOL)hide animated:(BOOL)animated {
  UIViewController *selectedViewController = self.selectedViewController;
  /**
  * If the selectedViewController is a UINavigationController, get the visibleViewController.
  * - setEdgesForExtendedLayout won't work with the UINavigationBarController itself.
  * - setExtendedLayoutIncludesOpaqueBars won't work with the UINavigationBarController itself.
  */
  if ([selectedViewController isKindOfClass:[UINavigationController class]])
    selectedViewController = ((UINavigationController *)selectedViewController).visibleViewController;
  __weak __typeof(self) weakSelf = self;

  void (^animations)(void) = ^{
      selectedViewController.edgesForExtendedLayout = UIRectEdgeAll;
      [selectedViewController setExtendedLayoutIncludesOpaqueBars:hide];
      weakSelf.tabBar.hidden = hide;

      /**
      * Just in case we have a navigationController, call layoutSubviews in order to resize the selectedViewController
      */
      [selectedViewController.navigationController.view layoutSubviews];
  };

  [UIView animateWithDuration:animated ? UINavigationControllerHideShowBarDuration : 0 animations:animations];
}

@end

Благодаря Вадим Труляев за то, что он указал на "Расширить края" - под символом "Непрозрачные бары"!

Ответ 5

Ответ одной строки Swift 3.

Поместите в подкласс UIViewController следующее:

    override var hidesBottomBarWhenPushed: Bool { get { return true }  set { self.hidesBottomBarWhenPushed = newValue }}

Ответ 6

To showTabbar:

- (void)showTabBar:(UITabBarController *) tabbarcontroller
    {
            //[UIView beginAnimations:nil context:NULL];
            //[UIView setAnimationDuration:0.5];
        for(UIView *view in tabbarcontroller.view.subviews)
                {


            if([view isKindOfClass:[UITabBar class]])
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, 521, view.frame.size.width, view.frame.size.height)];

                    }
            else
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 521)];
                    }
                }

            // [UIView commitAnimations];
    }

To hide Tabbar:
 - (void)hideTabBar:(UITabBarController *) tabbarcontroller
    {
            //[UIView beginAnimations:nil context:NULL];
            //[UIView setAnimationDuration:0.5];

        for(UIView *view in tabbarcontroller.view.subviews)
                {
            if([view isKindOfClass:[UITabBar class]])
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, 568, view.frame.size.width, view.frame.size.height)];
                    }
            else
                    {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 568)];
                    }
                }

            //[UIView commitAnimations];
    }

Ответ 7

Я долгое время боролся с этим, пытаясь разместить отзывчивую кнопку внизу таблицы. Я не использую авто-макет. Я обнаружил два основных отличия между iOS 6 и 7:

  • На iOS7, когда панель вкладок анимирована, представление контроллера корневого представления не распространяется на область, где была панель вкладок; его необходимо изменить.

  • На iOS7 только просмотр типа UITabBar должен быть анимирован и на экране.

Еще одна проблема с пунктом 1 заключается в том, что если в iOS7 вы увеличите детское представление вашего основного вида видимости на главном экране в пространстве, оставленном позади представления вкладки, оно не будет взаимодействовать, если основной вид не будет расширен также. Имея это в виду, я использовал следующий код:

Скрыть панель вкладок (отмените математику так, чтобы она отображалась):

[UIView animateWithDuration:kHideTabBarAnimationDuration animations:^{
    for(UIView *view in self.tabBarController.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y + view.frame.size.height, view.frame.size.width, view.frame.size.height)];
        }
        else
        {
            if (![MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height + self.tabBarController.tabBar.frame.size.height)];
            }
        }
    }
} completion:nil];

Настроить основной вид при скрытии панели вкладок:

// Expand view into the tab bar space
if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
    CGRect frame = self.view.frame;
    self.view.frame = CGRectMake(frame.origin.x,
                                 frame.origin.y,
                                 frame.size.width,
                                 frame.size.height + tabBarHeight);
}

Отрегулируйте основной вид при отображении панели вкладок:

[UIView animateWithDuration:kHideTabBarAnimationDuration delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
    // Create space for the tab bar            
    if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
    {
        CGRect frame = self.view.frame;
        self.view.frame = CGRectMake(frame.origin.x,
                                     frame.origin.y,
                                     frame.size.width,
                                     frame.size.height - tabBarHeight);
    }
} completion:nil];

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

Также обратите внимание на

В iOS 7, если вы поворачиваете с портрета на пейзаж, когда панель вкладок скрыта, черный ящик снова появляется. Я решил это, оживив панель вкладок на экране перед анимацией вращения (что было достаточно для того, над чем я работаю).

Ответ 8

Основываясь на решении @Vadim Trulyaev, я создал простое использование:

UITabBarController + HideTabBar.h

@interface UITabBarController (Additions)
- (void)setTabBarHidden:(BOOL)hidden myClass:(UIViewController *)myClass;
@end

UITabBarController + HideTabBar.m

#import "UITabBarController+HideTabBar.h"

@implementation UITabBarController (HideTabBar)

- (void)setTabBarHidden:(BOOL)hidden myClass:(UIViewController *)myClass{
    if ([myClass respondsToSelector:@selector(setExtendedLayoutIncludesOpaqueBars:)]) {
        //iOS 7 - hide by property
        NSLog(@"iOS 7");
        [myClass setExtendedLayoutIncludesOpaqueBars:hidden];
        self.tabBar.hidden = hidden;
    } else {
        //iOS 6 - move TabBar off screen
        NSLog(@"iOS 6");
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        float height = screenRect.size.height;
        if(hidden){
            [self moveTabBarToPosition:height];
        }else{
            [self moveTabBarToPosition:height - self.tabBar.frame.size.height];
        }
    }
}

//Moving the tab bar and its subviews offscreen so that top is at position y
-(void)moveTabBarToPosition:(int)y {
    self.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBar.frame.size.width, self.tabBar.frame.size.height);

    for(UIView *view in self.view.subviews) {
        if ([view isKindOfClass:[UITabBar class]]) {
            [view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)];
        } else {
            NSLog(@"%f",view.frame.size.height);
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)];
            NSLog(@"%f",view.frame.size.height);
            view.backgroundColor = [UIColor blackColor];
        }
    }
}

@end

Как использовать:

[[self tabBarController] setTabBarHidden:NO myClass:self];

НО, в iOS6 у меня есть проблема, когда я впервые прихожу к ViewController1, где табуляция скрыта, все работает отлично, но если я перейду в ViewController2, который отобразит панель вкладок и вернется в ViewController1, чтобы вкладка бар должен быть скрыт, появляется черное пространство. Кто-нибудь может мне помочь?!

Спасибо!

Ответ 9

В дополнение к другим отличным предложениям следующее предложение может помочь кому-то. Попробуйте настроить свою вкладку на скрытую в awakeFromNib, а не на более позднем этапе жизненного цикла. Я обнаружил, что скрытая вкладка мигает черным цветом, и это исправило это для меня.

- (void)awakeFromNib { [super awakeFromNib]; self.tabBarController.tabBar.hidden = YES; }

Ответ 10

Установите true свойство hidesBottomBarWhenPushed в контроллере, чтобы скрыть.

Для скрытия, все ваши контроллеры помещены в prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}