2009-03-24 18 views
32

Ho un UITabBarController dove il controller di visualizzazione predefinito è un UINavigationController. Voglio essere in grado di nascondere UITabBar di UITabBarController quando spingo una determinata vista nello UINavigationController.Nascondere UITabBar quando si preme un UIView

Ho provato ad aggiungere:

delegate.tabBarController.hidesBottomBarWhenPushed = YES; 

nel mio UINavigationController prima di spingere la vista, ma che non sembra fare il trucco.

Qualche consiglio su cosa dovrei fare o se è possibile? Grazie in anticipo!

risposta

94

questo è meglio:

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

È necessario impostare hidesBottomBarWhenPushed = YES sul controller che si sta per spingere in vista ...

+2

Questo è decisamente meglio. Grazie! – givp

+4

Una cosa da ricordare: è necessario inserire il codice sopra PRIMA di spingerlo sul controller. Questo è subito dopo la linea di inizializzazione. Non funzionerà se lo metti in viewDidLoad o in un luogo simile ... – Lukasz

+0

Molto bello, ho risolto le mie ore ore di lavoro !!! – Rahul

0

Si scopre che se si imposta la vista hidesBottomBarWhenPushed:YES nasconde la barra quando viene visualizzata la vista (duh sulla mia parte). Lo stavo assegnando allo UITabBarController, che non ha molto senso quando ci pensi.

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

questo è sbagliato. entrambi i metodi dovrebbero essere applicati al controller della vista che si sta per inserire. – hfossli

+1

Questa è una risposta molto sbagliata. –

2

Ecco come si arriva a questo lavoro :

Nel Application Delegate si crea il UITabBarController. Quindi si crea un UINavigationController con il controller di root come controller di visualizzazione desiderato nella scheda specifica. Quindi inserire UINavigationController nella matrice "viewControllers" di UITabBarController. in questo modo:

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]; 

In questo modo è possibile impostare il "hidesBottomBarWhenPushed" proprietà "YES" in qualsiasi controller vista all'interno che UINavigationController e sarà nascondere il UITabBar.

Spero che questo aiuti!

1

ti lascio qui il mio soluzione per questo:

#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]; 
} 

chiama il metodo 'setHidden' dove serve! Io uso questo e il 'Singleton Pattern', quindi le mie sottoview possono nascondere l'UITabBar nel suo Superview

+0

Nascondere come tale non funziona. Bene, funziona ma lascia dello sfondo nero in cui era la barra delle linguette, che non è accessibile dalla mia vista. Spostare la tabbar oltre la parte visibile dello schermo fa il trucco. Tuttavia, questo ha un impatto sui limiti dello schermo che possono avere effetti collaterali ad altre parti dell'App. –

+0

Siamo spiacenti, il commento sopra è errato e non posso più modificarlo. Cambiando in modo un po 'il frame view di tabBarController ha un impatto sul layoout di subViews rispetto alla soluzione (per me insufficiente) usando hidesBottomBarWhenPushed. Sto ancora indagando e potrei pubblicare un aggiornamento qui, a meno che l'errore non fosse da qualche parte nei miei calcoli. –

+0

Bene, ho osservato alcuni effetti collaterali che possono essere di interesse: ho avuto una piccola vista secondaria nella mia vista nella parte inferiore dello schermo intero.Situato supponendo che non ci sarà alcuna barra delle linguette e quindi utilizzando lo spazio che di solito occupa la barra delle schede. Ho aggiunto questa vista secondaria in IB. In IB impunisci ciascuna vista a uno o più bordi o al centro dello schermo/sottomenu per scopi di autosizing. Questo tipo di automatizza il cambiamento di orientamento. Tuttavia, ha riposizionato la mia sottoview insieme alla barra delle schede in qualche parte sotto lo schermo. Tieni a mente solo l'autoscatto. –

3

Ho capito come risolverlo, stavo correndo lo stesso problema, ma Apple ci dice anche come farlo nel campione chiamato: "The Elements" (http://developer.apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html)

Vedere funzione qui sotto su come farlo, aggiungere questo alla funzione init della vista che si desidera spingere!

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

Si nasconderà automaticamente la barra delle linguette come la foto app fa sul vostro iPhone. E quando si torna indietro, la vista genitore mostrerà di nuovo la barra delle linguette.

Buona fortuna

+0

Funziona alla grande per me. Meglio di qualsiasi altra soluzione finora – rpgmaker

3

Ho provato la maggior parte delle soluzioni proposte.Alla fine nessuno di loro ha funzionato per me.

hideTabBarWhenPushed nasconde la barra delle schede non solo per il controller di visualizzazione che viene premuto successivamente ma per tutti i controller di visualizzazione inseriti all'interno. Per quelli che volevo che il controller della barra delle schede riapparisse.

La soluzione di Orafaelreis (vedi sopra) sembrava essere la soluzione più adatta. Ma il suo tentativo ha funzionato solo per rigidi orientamenti di ritratto, nemmeno per capovolgere. Quindi ho dovuto ripararlo. Questo è quello che ho finalmente ottenuto:

#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; 
} 

I commenti in linea dovrebbero spiegare il ragionamento per ogni affermazione. Tuttavia, potrebbero esserci modi più intelligenti di codificarlo.

C'è un effetto collaterale in congiunzione con nascondere anche la barra di stato e la barra di navigazione, che non voglio nascondere a voi ragazzi. 1. Quando si torna da questo controller di navigazione al controller di navigazione chiamante, la barra di stato e la barra di navigazione sul controller chiamante si sovrappongono fino a quando il dispositivo non viene ruotato una volta o fino a quando la relativa scheda non viene nuovamente selezionata dopo un'altra scheda. 2. Quando il controller della vista chiamante è una vista tabella e quando il dispositivo è in modalità orizzontale quando si torna alla tabella, la tabella viene visualizzata nell'orientamento appropriato per l'orizzontale, ma viene disposta come se fosse ritratto. L'angolo in alto a sinistra va bene, ma alcune celle della tabella più una barra delle schede sono nascoste sotto lo schermo. Sul lato destro c'è dello spazio libero. Anche questo viene risolto ruotando nuovamente il dispositivo.

Ti terrò aggiornato una volta trovata le soluzioni per questi bug minori ma sgradevoli.

3

quando si lavora con storyboard sua facile da installare controller della vista che nasconde la barra delle linguette sulla spinta, sul controller vista di destinazione è sufficiente selezionare la casella di controllo:
enter image description here

0

nel primo UIViewController "FirstItemViewController"

@IBAction func pushToControllerAction(sender: AnyObject) { 
    self.hidesBottomBarWhenPushed = true 
    self.performSegueWithIdentifier("nextController", sender: self) 
} 

nel prossimo 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 
      } 
     } 
} 

Guarda questa risposta https://stackoverflow.com/a/36148064/3078925

Problemi correlati