2010-08-23 16 views
6

Czy istnieje sposób na wyświetlenie paska kart po jego ukryciu?Pokaż pasek kart po ukrytym

Mam strukturę tabbar-nav. W przypadku jednej z kart muszę ukryć pasek kart w widoku drugiego i trzeciego poziomu. Ale jednocześnie będę musiał pokazać swój pierwszy i czwarty widok.

Przykładowy kod z Elementów nie ma tutaj zastosowania.

Odpowiedz

4

Znalazłem całkiem dobre pragmatyczne rozwiązanie tego problemu - spraw, aby widok UITabBarController był większy niż powinien być, tak aby rzeczywisty UITabBar został przycięty przez ekran.

Zakładając, że widok pasek kart zwykle wypełnia swoje Superview, coś takiego powinno działać:

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; 

Pasek karta jest nadal widoczne, ale to się w dolnej części ekranu, tak wydaje się być ukryty.

Może to mieć wpływ na wydajność, jeśli powoduje dodatkowe obcinanie, ale jak na razie wygląda na to, że działa.

+0

dziękuję bardzo ... jest bardzo pomocna dla mnie ... to prawie miesiąc poszukiwania ... – Hiren

1

Trzeba wdrożyć metodę delegata

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

Wewnątrz można sprawdzić, który wskaźnik jest wybrany i pokazać pasek kart

if([[tabBarController.viewControllers objectAtIndex:0] isEqual:viewController])// it is first tab 
{ 
     tabBarController.tabBar.hidden = FALSE; 
} 
+0

Hi mihirpmehta, Niezupełnie sytuacja jestem. na mojej sytuacji jego struktury umieszczenie zakładek-nav. Mam nadzieję, że pokażę pasek zakładek na pierwszym i czwartym poziomie. Ale ukryj to dla drugiego i trzeciego widoku. Ten, który opisałeś, jest po kliknięciu elementów paska kart? Zastanawiam się, czy mogę zrobić coś w rodzaju: delegate.tabbarcontroller.tabbar.hidden = false delegate.viewController.hidesBottomBarWhenPushed = NO nie wydaje się przywrócić tabbar z powrotem do widoku. ustawienie siebie.hidesBottomBarWhenPushed = NO na viewDidLoad nie działa również – ngzhongcai

+0

Masz rację, że hidesBottomBarWhenPushed jest bezużyteczne, ponieważ jak udokumentowano "dolny pasek pozostaje ukryty, dopóki kontroler widoku nie zostanie usunięty ze stosu." – imaginaryboy

1

The UIViewControllers że są wypychane na stos nawigacyjnym można zrobić coś podobnego do następującego:

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

EDYCJA: Dodano dodatkowy kod belo w radzić sobie z ramą. Nie sądzę, żebym szczególnie polecał ten pomysł, ponieważ opiera się na wewnętrznej domyślnej strukturze widoku kontrolera UITabBarController.

Zdefiniuj następujące kategorię na 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 

Następnie, zamiast używania zmianę tabBar.hidden pierwotnie sugerowany, wykonaj następujące czynności:

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

Oczywiście upewniając się, że realizacja ma włączyła definicję kategorii, aby znany był "showTabBar".

+0

Wypróbowałem powyższe ... co się dzieje, gdy tabbar zostaje ukryty, ale na miejscu jest biały, brzydki pusty pasek, w którym tabbar jest "ukryty" – ngzhongcai

+0

Ach, tak, ma sens, i oczywiście nie zauważyłem tego, ponieważ w szybka próbka, którą wypróbowałem, była już biała. Wygląda na to, że może zajść konieczność ramki dowolnego widoku na głównym obszarze wyświetlania, aby zająć miejsce pozostawione przez ukryty tabBar. Wydaje się, że jest to trochę hack, próbując zmusić go do współpracy. – imaginaryboy

0

Wiem, że jest to stary post, ale myślę, że poniższy kod pomoże ukryć pasek na kontrolerze, którego nie chcesz, i ma dodatkową zaletę automatycznego odczytywania paska zakładek po powrocie z tego widoku. kontroler

UIViewController *hideTabbarViewController = [[UIViewController alloc] init]; 
hideTabbarViewController.hidesBottomBarWhenPushed = YES; 
[[self navigationController] hideTabbarViewController animated:YES]; 
Powiązane problemy