Domanda

Ho un UITabBarController, e ogni scheda maniglie un UIViewController diversa che spinge sui nuovi controllori di stack, se necessario. In due di queste schede ho bisogno, quando si raggiunge un controller specifico, la possibilità di ruotare l'iPhone e visualizzare una vista in modalità orizzontale. Dopo aver lottato un sacco ho scoperto che è obbligatorio sottoclasse UITabBarController di ignorare shouldAutorotateToInterfaceOrientation. Tuttavia, se semplicemente tornare SI nella realizzazione, il seguente effetto collaterale indesiderato deriva:

ogni controller in ogni scheda viene messo automaticamente in modalità orizzontale quando si ruota l'iPhone.

Anche shouldAutorotateToInterfaceOrientation imperativo di ogni controller per tornare NO non funziona:. Quando si ruota l'iPhone, il controllore viene messo in modalità orizzontale

ho implementato shouldAutorotateToInterfaceOrientation come segue nella UITabBarController sottoclasse:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self selectedIndex] == 0 || [self selectedIndex] == 3)
        return YES;

    return NO;
}

in modo che solo le due linguette Sono interessato a effettivamente ottenere il supporto per la modalità orizzontale. C'è un modo per supportare la modalità paesaggio per un controller specifico sulla pila di una scheda particolare?

Ho cercato, senza successo, qualcosa come

(BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

if([self selectedIndex] == 0 || [self selectedIndex] == 3)
{   
   if ([[self selectedViewController] isKindOfClass: [landscapeModeViewController class]])
           return YES;
    }

     return NO;

}

Inoltre, ho provato ad utilizzare il metodo delegato didSelectViewController, senza successo. Qualsiasi aiuto è molto apprezzato. Grazie.

È stato utile?

Soluzione

Questo ha funzionato per me:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}

Altri suggerimenti

Ecco una proroga per UITabBarController che i delegati chiamate a shouldAutorotateToInterfaceOrientation al controller bambino attualmente selezionato. Utilizzando questa estensione, non è necessario creare una sottoclasse più UITabBarController ed è possibile utilizzare shouldAutorotateToInterfaceOrientation nel vostro controller, come ci si aspetterebbe.

UITabBarController + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

UITabBarController + Autorotate.m:

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

Sono stato in grado di utilizzare questo per un po 'di tempo (dal regolatore scheda bar di mia app) senza problemi:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

In questo modo, nella VC del caso, si arriva a fare il reale controllare, in questo caso per una vista galleria fotografica (che altro?):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

La mia opinione galleria non è nemmeno la pila top-of-per un dato controller Nav. E ancora viene chiamato.

Purtroppo, ho appena scoperto che questo non il lavoro così bene quando il VC è in agguato all'interno del MoreViewController (in contrasto con le quattro schede principali). In tal caso, la mia galleria VC non viene mai chiamato. Penso che sia perché il VC Ho chiamato tutti insieme è davvero il controller di navigazione dalla scheda selezionata, che poi si propaga cose al VC del caso, in questo caso la mia galleria fotografica VC. Ma per i più VC, le cose non funzionano così bene ... aaaand le cose vanno a rotazione in discesa da lì. : \

Ho provato ad utilizzare le modifiche da Andreas (vedi altrove in questo thread), senza alcun risultato. Indizi benvenuti!

Mi sono imbattuto negli stessi problemi come avete fatto quando si lavora con l'UITabBarController. Avevo bisogno di controllare quali UIViewControllers è stato permesso di ruotare e che non erano. Il mio problema principale era con la scheda Altro. Non volevo che nessuno dei UIViewControllers inclusi nella scheda MORE per ruotare.

La mia soluzione era quella di creare la mia UITabBarController che ho chiamato MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

Poi ho implementato il metodo shouldAutorotateToInterfaceOrientation:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

avevo bisogno di scoprire se è stata selezionata la scheda di più. Questo è un processo in due fasi; quando la scheda PIU viene selezionata inizialmente l'API restituisce un selectedIndex superiore 4 quindi si deve confrontare il controller selezionato con il moreNavigationController.

Se un UIViewController viene selezionata dalla scheda più quindi il selectedIndex è finalmente 4, ma il selectedController non è più la moreNavigationController ma l'UIViewController selezionato.

Il if ((controllore == [auto moreNavigationController]) || ([sé selectedIndex] == 4)) si prende cura di questo problema.

Ora, quando eseguo la mia applicazione miei UIViewControllers nella scheda PIU non vengono ruotate. Spero che questo vi aiuterà altri sviluppatori che eseguono nelle stesse questioni come ho fatto io.

Emilio

Da quello che ho visto qui e altrove ho cuciti insieme una soluzione che utilizza il metodo shouldAutorotate dal momento che la vecchia shouldAutorotateToInterfaceOrientation è stato sconsigliato.

ho messo dentro una categoria per UITabBarController. Ho quindi spero che questo è ammissibile!

// call to method shouldAutorotate replaces call to method shouldAutorotateToInterfaceOrientation (deprecated)
-(BOOL)shouldAutorotate
{ // check whether selected view controller should autorotate    
  UIViewController *controller = self.selectedViewController;
  if ([controller isKindOfClass:[UINavigationController class]])
    { // in case it is a navigation controller: get visible view of that
      controller = [(UINavigationController *)controller visibleViewController];
    }
  return [controller shouldAutorotate];
}

Grazie, Grazie, Grazie. Questo è stato 2 giorni a capire come fare questo. Qui è il mio prendere su tutto il vostro grande aiuto quando si ha un tabBarController con navigationControllers.

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

Ogni critica del codice di un codificatore Neofiti è sempre apprezzato ... jack

E 'davvero OK per creare una sottoclasse UITabBarController (come suggerito nella risposta accettata sopra)?

Ho capito che le mele dice qualcosa come "non si dovrebbe mai mai sottoclasse UITabBarController o UINavigationController" -? O ho frainteso

In ogni caso; Ho trovato questo esercitazione dove sottoclassi UIViewController in cui hanno messo un UITabBarController.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top