2014-11-02 22 views
5

Sto riscontrando problemi di acquisizione quando il player di YouTube entra a pieno schermo o esce a schermo intero in iOS 8 perché queste notifiche sono state rimosse UIMoviePlayerControllerDidEnterFullscreenNotification e UIMoviePlayerControllerWillExitFullscreenNotification per questa versione SO versione.Forza o abilita correttamente la modalità orizzontale per Youtube video incorporato in iOS 8 senza NSNotificationCenter

Poiché il mio progetto di app è impostato per essere solo in modalità verticale, il video non ruoterà in modalità orizzontale quando è in riproduzione, il che non è molto facile da usare quando si guarda un video sul dispositivo.

Di solito l'utente vorrebbe guardare il video in modalità verticale o orizzontale quando il video entra a pieno schermo.

questi è il modo in cui mi facevo per iOS 7 che è stato perfetto funzionamento, ma non in iOS 8.

In primo luogo, voglio impostare questa funzione nella mia AppDelegate.m con la proprietà booleana nel mio AppDelegate.h che ho chiamato videoIsInFullscreen e funzione,

// this in the AppDelegate.h 
@property (nonatomic) BOOL videoIsInFullscreen; 


// This in my AppDelegate.m to allow landscape mode when the boolean property is set to yes/true. 
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    if(self.videoIsInFullscreen == YES) 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    else 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Poi nel mio ViewController.m primo luogo, vorrei #import "AppDelegate.h" dopo aver fatto questo, vorrei aggiungere alcune notifiche nel mio metodo viewDidLoad ..

-(void)viewDidLoad { 

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

} 

Naturalmente non dimenticate di togliere loro ..

-(void)dealloc { 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; 

} 

Poi, ho avuto le mie funzioni che otterrà chiamato quando queste notifiche diventano fuochi ... Qui è dove mi permetto modalità paesaggio e quindi riportarlo in verticale. Questo è il caso con la mia app perché è impostato solo per il supporto verticale, ma non lo voglio per i video di YouTube.

// first we set our property in the our AppDelegate to YES to allow landscape mode 
- (void)playerStarted 
{ 
    ((AppDelegate*)[[UIApplication sharedApplication] delegate]).videoIsInFullscreen = YES; 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
} 

// Then I will set the property to NO and force the orientation to rotate to portrait. 
- (void)playerEnded 
{  
    ((AppDelegate*)[[UIApplication sharedApplication] delegate]).videoIsInFullscreen = NO; 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
} 

Ma, questi non è il caso per iOS 8 .. Queste notifiche non funzionano più per iOS 8 così, ho trovato qualcosa di simile utilizzando queste notifiche, ma io non sono troppo felice, perché non sono precisi al 100% per il video player. UIWindowDidBecomeVisibleNotification e UIWindowDidBecomeHiddenNotification Quindi, come posso farlo correttamente o almeno che funzioni correttamente per il mio video incorporato su YouTube e consentire la modalità orizzontale in iOS 8 ...?

risposta

3

Così, dopo qualche ricerca e alla ricerca più approfondita a questo problema .. Ho venuto a una soluzione utilizzando i UIWebView delegati, in più ho dovuto risolvere un altro problema in termini di mia funzione - (void)playerEnded quale non funzionava correttamente nei nuovi dispositivi iPhone 6 ..

Ecco come ho fatto .. in primo luogo, nel mio metodo webViewDidFinishLoad ho aggiunto alla mia WebView una valutazione javascript per controllare quando il video player entra in modalità a schermo intero ..

- (void)webViewDidFinishLoad:(UIWebView*)webView 
{ 
    // adding listener to webView 
    [_webView stringByEvaluatingJavaScriptFromString:@" for (var i = 0, videos = document.getElementsByTagName('video'); i < videos.length; i++) {" 
                @"  videos[i].addEventListener('webkitbeginfullscreen', function(){ " 
                @"   window.location = 'videohandler://begin-fullscreen';" 
                @"  }, false);" 
                @"" 
                @"  videos[i].addEventListener('webkitendfullscreen', function(){ " 
                @"   window.location = 'videohandler://end-fullscreen';" 
                @"  }, false);" 
                @" }" 
                ]; 
} 

Quindi, nel mio metodo - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType, controllo quando quest url corrisponde allo stato del player di youtube, come questo .. Questo attiverà la nostra funzione per consentire la modalità orizzontale o tornare alla modalità verticale .. o forse qualsiasi altro tipo di lavoro che potresti voler fare ..

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    // allows youtube player in landscape mode 
    if ([request.URL.absoluteString isEqualToString:@"ytplayer://onStateChange?data=3"]) 
    { 
     [self playerStarted]; 

     return NO; 
    } 
    if ([request.URL.absoluteString isEqualToString:@"ytplayer://onStateChange?data=2"]) 
    { 
     [self playerEnded]; 

     return NO; 
    } 
} 

Infine, ho dovuto regolare la funzione player Ended per forzare la modalità portrait per i dispositivi iPhone 6.

- (void)playerEnded 
{ 
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"]; 

    ((AppDelegate*)[[UIApplication sharedApplication] delegate]).videoIsInFullscreen = NO; 

    [self supportedInterfaceOrientations]; 

    [self shouldAutorotate:UIInterfaceOrientationPortrait]; 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 
} 

Quasi, perse ho aggiunto anche queste due altre funzioni ..

- (NSInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotate:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

Così, finalmente sono in grado di catturare lo stato del giocatore reale e sparare le mie funzioni di fare qualche lavoro o qualsiasi altra cosa voglio che al momento giusto, nel mio caso cambiare l'orientamento ..

spero che questo aiuta a qualcun altro ..

+0

provato - non raggiunge -player Avviato e giocatore terminato. equest.URL.absoluteString è principalmente su: blank e http: //www.youtube.com/embed/..... - e questo è prima di riprodurre il video. Quando viene riprodotto il video dovrebbe essere avviato StarLoadWithRequest. qualche idea? – Boaz

+0

shouldStartLoadWithRequest prenderà fuoco quando il video viene riprodotto e puoi catturare lo stato come mostrato sopra. Non sono sicuro che sto capendo correttamente la tua domanda. In non ci sono notifiche coinvolgere .. questo funziona se stai usando il video incorporato di YouTube all'interno di un iframe in una webview .. – NorthBlast

+0

beh, doesnt :(Ho messo NSLog (@ "URL:% @", request.URL .absoluteString), all'inizio della funzione e non ottengo stampe quando clicco su play – Boaz

0

sto lavorando su sWIFT, io il mio lettore viene eseguito di film sia in verticale e direzione del paesaggio. Per prima cosa ho controllato tre modalità: portrait, landscapeleft, landscaperight. In secondo luogo ho scritto questa funzione in tutta viewController:

isFullScreen = false 
override func shouldAutorotate() -> Bool { 
    if isFullScreen == true { 
     return true 
    }else{ 
     return false 
    } 
} 

Terzo cambio il valore di IsFullScreen in questa funzione:

func playerView(playerView: YTPlayerView!, didChangeToState state: YTPlayerState) { 
    switch (state) { 
     case YTPlayerState.Playing: 
       println("started to play") 
     isFullScreen == true 
     shouldAutorotate() 
     case YTPlayerState.Paused: 
       println("paused") 
     default: 
      println("non of sttate") 
     break 
    } 
} 

E il video funziona sia su modalità ritratto e del paesaggio! La cosa interessante è che non riesco a impostare isFullScreen su false quando metto in pausa i video o mi muovo da schermo intero. Tuttavia non ruota! Qualcuno può spiegarlo?

Problemi correlati