2013-05-02 36 views
8

Desidero supportare solo l'orientamento verticale su tutti i controller di visualizzazione della mia app iOS. Tuttavia, incorporo un video di YouTube in uno dei miei controller di visualizzazione, e quando quel video è selezionato per occupare tutto lo schermo, voglio che l'utente sia in grado di orientare il suo telefono orizzontalmente in modo che il video si espanda per prendere lo schermo intero .Autorotazione iOS 6.0+ per video incorporato youtube

EDIT: Ho provato ad utilizzare il codice da Autorotate in iOS 6 has strange behaviour:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 

return self.fullScreenVideoIsPlaying ? 
    UIInterfaceOrientationMaskAllButUpsideDown : 
    UIInterfaceOrientationMaskPortrait; 

}

ea mio controller della vista che presenta la/YouTube telaio UIWebView, ho questo codice nel mio viewDidLoad:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(windowNowVisible:) 
    name:UIWindowDidBecomeVisibleNotification 
    object:self.view.window 
]; 

- (void)windowNowVisible:(NSNotification *)notification 
{ 
    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = !(appDelegate.fullScreenVideoIsPlaying); 
} 

Tuttavia, quando l'utente preme sul video YouTube a schermo intero, se lui/lei ha ancora il telefono ho in modo riepilogativo, anche il controller della vista di presentazione rimane orizzontale (voglio che il controller della vista attuale sia ritratto). È una gara sulla variabile fullSreenVideoIsPlaying che non si aggiorna abbastanza velocemente in modo che il mio controller di visualizzazione che presenta sia ritratto.

Qualsiasi feedback su come ottenere ciò sarebbe molto apprezzato.

Grazie!

+0

Si può leggere - http://buddingdevelopers.com/autorotation-in-ios/ Autorotation è chiaramente spiegato qui. – Xcoder

+0

possibile duplicato: http://stackoverflow.com/questions/13580753/mpmovieplayercontroller-rotating-in-full-screen-while-the-parent-view-controller –

risposta

21

Calcolato una soluzione modellando insieme alcune soluzioni che ho trovato su StackOverflow.

Invece di usare questa notifica

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(windowNowVisible:) 
     name:UIWindowDidBecomeVisibleNotification 
     object:self.view.window 
]; 

Io uso le seguenti notifiche

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeStarted:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeFinished:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; 

con le implementazioni

-(void) youTubeStarted:(NSNotification*) notif { 
    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = YES; 
} 
-(void) youTubeFinished:(NSNotification*) notif { 
    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = NO; 
} 

e nel mio AppDelegate, ho

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    NSUInteger orientations = UIInterfaceOrientationMaskPortrait; 
    if (self.fullScreenVideoIsPlaying) { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    else {   
     if(self.window.rootViewController){ 
      UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; 
      orientations = [presentedViewController supportedInterfaceOrientations]; 
    } 
return orientations; 
} 

e nei miei controller di vista, ho

-(BOOL) shouldAutorotate { 
    return NO; 
} 
-(NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ 
    return UIInterfaceOrientationPortrait; 
} 
+2

Basta tenere tenere presente che l'utilizzo di notifiche private ('UIMoviePlayerControllerDidEnterFullscreenNotification' e' UIMoviePlayerControllerWillExitFullscreenNotification') potrebbe interrompere le future versioni di iOS o causare il rifiuto di App Store. – jszumski

+0

Ok grazie! Conosci altre notifiche che potrei usare? –

+0

Sfortunatamente l'SDK non fornisce alcuno come da iOS 6. – jszumski

6

Ho riscontrato lo stesso problema in passato e la soluzione migliore che ho trovato che funzionava in iOS 5.xe 6.x era di presentare il controller video in modalità modale.

La vista modale è una UINavigationController che avvolge il controller video e risponde con UIInterfaceOrientationMaskAll in supportedInterfaceOrientations. Nella vista modale viewWillAppear:, lanciare fullScreenVideoIsPlaying in YES e impostarlo su NO in viewWillDisappear:. Questa disposizione manterrà i controller della vista sottostanti in verticale mentre consente alla vista modale di ruotare come l'utente ritiene opportuno.

+1

grazie per la vostra risposta..aveva una rapida domanda di follow-up. Al momento, la mia UIWebView del video di YouTube è una piccola cella (200x100) nel mezzo del mio controller di visualizzazione.Quando è selezionato per la riproduzione, come posso presentare il video in un controller modale? In altre parole, come si ottiene una richiamata che l'utente ha premuto il pulsante di riproduzione in UIWebView? –

+0

Il lettore video che proviene dalla visualizzazione Web rispetterà le impostazioni di rotazione del genitore, quindi dovrai rendere il tuo "controller di visualizzazione presentando" una vista modale. – jszumski

+0

Capisco che il video player rispetterà le impostazioni di rotazione dei suoi genitori; tuttavia, il mio problema è che non voglio che il controller della vista attuale sia in grado di ruotare orizzontalmente. Solo il lettore video che presenta dovrebbe essere in grado di ruotare orizzontalmente –

Problemi correlati