2009-03-24 4 views
32

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

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

delegate.tabBarController.hidesBottomBarWhenPushed = YES; 

в моем UINavigationController, прежде чем я нажимаю точку зрения, но это, кажется, не сделать трюк.

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

ответ

94

Это лучше:

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

Вы должны установить hidesBottomBarWhenPushed = ДА на контроллере вы собираетесь нажать в поле зрения ...

+2

Это определенно лучше. Спасибо! – givp

+4

Одна вещь, которую следует помнить: вы должны поставить код выше, прежде чем нажимать на контроллер. Это сразу после строки инициализации. Он НЕ будет работать, если вы поместите это в viewDidLoad или подобное место ... – Lukasz

+0

Очень приятно, решено, что часы часов часов !!! – Rahul

0

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

[self.view hidesBottomBarWhenPushed:YES]; 
[super pushViewController:viewController animated:animated]; 
+4

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

+1

Это очень неправильный ответ. –

2

Вот как получить эту работу :

В 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

Я дам здесь мое решение для этого:

#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

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

+0

Извините, комментарий выше был неправильным, и я не могу его отредактировать. Поразительно изменение рамки представления tabBarController имеет некоторое влияние на развертывание подвидных объектов по сравнению с решением (для меня недостаточно) с использованием hidesBottomBarWhenPushed. Я все еще расследую и могу опубликовать обновление здесь, если ошибка не была где-то в моих расчетах. –

+0

Ну, я действительно наблюдал некоторый побочный эффект, который может представлять интерес: у меня был небольшой дополнительный вид в моем представлении в самом низу полного экрана.Предполагается, что не будет панели вкладок и, следовательно, будет использовать пространство, которое обычно занимает панель вкладок. Я добавил этот под просмотр в IB. В IB вы вышиваете каждый вид на один или несколько ребер или центр экрана/подсекретаря для целей автосохранения. Этот тип автоматизирует изменение ориентации. Тем не менее, он переместил мое подвью вместе с панелью вкладок куда-то под экраном. Просто держите авторазмышление в уме. –

3

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

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

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

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

Успехов

+0

Это отлично работает для меня. Лучше любых других решений до сих пор – rpgmaker

3

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

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

Решение 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

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

0

в первом 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

Смежные вопросы