2013-06-19 12 views
10

La mia app per iPhone è un'app solo per orientamento verticale e nella mia app ho uno UITableView che ha un nel primo UITableCell. Lo UIWebView mostra un video di YouTube incorporato. Quando clicco sul video per giocare entra in modalità a schermo intero. Quello che devo fare è, consentire all'utente di ruotare il loro dispositivo e riprodurre il video in modalità orizzontale. Quindi, quando il video viene arrestato, consentire solo ritratti. Ho configurato per ascoltare la notifica quando il video entra a pieno schermo e lascia lo schermo intero. Ma non so come consentire a livello di programmazione all'utente di ruotare l'orientamento dell'interfaccia.Consenti UIInterfaceOrientationLandscape durante la riproduzione di video UIWebView

quindi fondamentalmente ho 2 metodi chiamato quando la notifica viene passato

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

-(void)youTubeStarted:(NSNotification *)notification{ 
    // Entered fullscreen code goes here. 
} 

-(void)youTubeFinished:(NSNotification *)notification{ 
    // Left fullscreen code goes here. 
} 

Cosa avrei messo in quei 2 metodi per consentire il cambiamento dell'orientamento solo durante la riproduzione video?

+0

Fate attenzione, dal momento che IOS6 la notifica per il 'tasto il video fatto' sembra essere: 'UIMoviePlayerControllerWillExitFullscreenNotification' (vedi: http://stackoverflow.com/a/8554040/1436861 e http: // StackOverflow. com/a/12681507/1436861) –

+0

possibile duplicato di [UIMoviePlayerControllerDidEnterFullscreenNotification non funziona in iOS8] (http://stackoverflow.com/questions/25561812/uimovieplayercontrollerdidenterfullscreennotification-not-work-in-ios8) –

risposta

19

L'ho capito. Nei miei 2 metodi:

-(void)youTubeStarted:(NSNotification *)notification{ 
    // Entered Fullscreen code goes here.. 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = YES; 
} 

-(void)youTubeFinished:(NSNotification *)notification{ 
    // Left fullscreen code goes here... 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = NO; 

    //CODE BELOW FORCES APP BACK TO PORTRAIT ORIENTATION ONCE YOU LEAVE VIDEO. 
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
    //present/dismiss viewcontroller in order to activate rotating. 
    UIViewController *mVC = [[UIViewController alloc] init]; 
    [self presentModalViewController:mVC animated:NO]; 
    [self dismissModalViewControllerAnimated:NO]; 
} 

ho accede mio delegato App nei metodi di cui sopra impostando la proprietà BOOL della mia AppDelegate. Poi ho chiamato il metodo di applicazione di seguito nel mio AppDelegate.m:

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

    } 
    return orientations; 
} 
} 

Il self.fullScreenVideoIsPlaying è un BOOL che ho impostato come una proprietà nel mio file AppDelegate.h.

Spero che questo aiuti gli altri nelle 5 ore in cui ho perso l'idea.

+0

Grazie !! Ho passato diverse ore a cercare una risposta a questo problema e la tua soluzione era di gran lunga la più semplice. Molto apprezzato :) –

+0

Ho cercato ore su come risolvere il mio problema di rotazione. Questo l'ha risolto; tuttavia, non riesco a convincerlo a disabilitare la rotazione al termine del video. Dove hai messo la chiamata di notifica per teTubeFinished? – helloimbarbara

+1

Non importa, l'ho risolto. Mi rendo conto che la mia intera app stava ruotando. Per risolvere questo problema, ho rimosso l'istruzione if (self.window.rootViewController) nel metodo supportedInterfaceOrientationsForWindow.Ora tutto funziona perfettamente. Grazie per aver postato questo! – helloimbarbara

0

si avrebbe una variabile di stato globale, probabilmente nella vostra applicazione delegato o dovunque si memorizzare le variabili che dovrebbero essere accessibile a livello globale, e quindi impostarlo su true o false seconda scendessimo il giocatore film è a schermo intero oppure no. Nei callback che vengono chiamati per ruotare l'app, si controlla lo stato della variabile e in base a tale ritorno se la rotazione è consentita o meno.

+0

Probabilmente avrei dovuto dire che io aveva anche un BOOL impostato per quella precisa ragione ma non sono riuscito a provare a cambiare se la rotazione è consentita o meno nelle richiamate per ruotare l'app. Sareste in grado di mostrarmi un codice che lo consentirebbe? –

2

Se si desidera supportare solo la riproduzione orizzontale a schermo intero. Da iOS 8 in poi, i video da UIWebView riproducono all'interno di AVPlayerViewController.

Nel tuo AppDelegate controlla se la finestra di presentazione contiene AVPlayerViewController.

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 

    if let w = window, let root = w.rootViewController { 

     if root.childViewControllers.first is AVPlayerViewController { 
      return UIInterfaceOrientationMask.allButUpsideDown 
     } 
    } 

    return UIInterfaceOrientationMask.portrait 
} 
Problemi correlati