5

Ho bisogno che la mia app sia compatibile su iPad e iPhone. Ha un tabbarController come rootViewController.Supporto dell'app universale con orientamento verticale su iPhone e Orizzontale + Ritratto su iPad

In iPad ho bisogno che sia disponibile sia in orizzontale che in verticale. In iPhone, tuttavia, ho bisogno che il rootView sia Portrait e io ho alcuni viewControllers, che vengono presentati sul tabbarController, che devono essere disponibili sia in landscape che in Portrait (ad esempio un viewController utilizzato per riprodurre video da Youtube). Quindi sto bloccando la rotazione del tabbarController come segue (nella sottoclasse UITabbarController).

# pragma mark - UIRotation Methods 

- (BOOL)shouldAutorotate{ 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait; 
} 

Quello che intendo fare è che bloccando la rotazione del RootViewController (tabbarController), sto bloccaggio tutto il VC nel tabbarController (solo su iPhone) e viste che sono presentati in cima alla tabbarController può ruotare secondo l'orientamento del dispositivo.

IL PROBLEMA

Tutto funziona come previsto fino a quando l'applicazione viene avviata nel paesaggio in iPhone. Quando viene avviato in modalità orizzontale, l'app si imposta automaticamente in orizzontale e avvia l'app in modalità orizzontale che non è destinata. Dovrebbe essere avviato in modalità Ritratto stesso anche se l'orientamento del dispositivo è Orizzontale. Dal momento che sto disattivando la rotazione automatica per iPhone, l'app continua a trovarsi nel paesaggio stesso causando un bug. Ho provato questo metodo per forzare l'applicazione per lanciare nel ritratto nell'applicazione: didFinishLaunchingWithOptions:

#pragma mark - Rotation Lock (iPhone) 

- (void)configurePortraitOnlyIfDeviceIsiPhone{ 
    if ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)) 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 
} 

Ancora il problema persiste. Ho autorizzato tutte le opzioni di orientamento su info.plist per la chiave SupportedInterfaceOrientaions sia per iPad che per iPhone poiché ho bisogno che l'app sia in orizzontale per iPhone anche se solo per alcuni viewControllers. Il problema può essere risolto se riesco in qualche modo a forzare l'avvio dell'app in Orientamento verticale anche se l'orientamento del dispositivo è Orizzontale. Per favore correggimi se sbaglio nella logica, in caso contrario, sarà apprezzato qualsiasi aiuto per rendere l'avvio dell'app in modalità ritratto.

Sono già passato attraverso this question here e here, ma non è riuscito a farlo funzionare ancora.

Thank You

risposta

4

Questo è come sono riuscito a farlo funzionare. In AppDelegate.m, ho aggiunto questo metodo.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    //if iPad return all orientation 
    if ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)) 
     return UIInterfaceOrientationMaskAll; 

    //proceed to lock portrait only if iPhone 
    AGTabbarController *tab = (AGTabbarController *)[UIApplication sharedApplication].keyWindow.rootViewController; 
    if ([tab.presentedViewController isKindOfClass:[YouTubeVideoPlayerViewController class]]) 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    return UIInterfaceOrientationMaskPortrait; 
} 

Questo metodo controlla ogni volta che viene visualizzata una vista per l'orientamento e corregge l'orientamento come richiesto. Resto tutti gli orientamenti per l'iPad e nessuno per l'iPhone con l'eccezione che la vista che deve essere presentata (quella che dovrebbe ruotare, YouTubeVideoPlayerViewController) è stata disattivata.

E nella sottoclasse tabbarController,

# pragma mark - UIRotation Methods 

- (BOOL)shouldAutorotate{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait; 
} 

Il problema era che quando torneremo no al shouldAutoRotate l'applicazione ignorerà tutte le notifiche di modifica di rotazione. Dovrebbe restituire YES in modo che ruoti all'orientamento corretto descritto in supportedInterfaceOrientations

Suppongo che questo è il modo in cui dovremmo avvicinarci a questo requisito piuttosto che passare le istruzioni di rotazione ai rispettivi viewControllers come molti post hanno detto su SO.Questo è un vantaggio dell'utilizzo di contenitori come raccomandato da Apple, in modo da non dover codificare le istruzioni di rotazione su ogni singola vista in un contenitore.

+0

Buona comprensione, lo implementerò. Grazie, stavo cercando questo tipo di soluzione, che possiamo implementare in AppDelegate e non è necessario scrivere in tutti i controller di visualizzazione. –

Problemi correlati