2013-06-24 12 views
19

Sto provando a trasmettere un video nella mia app. Il metodo che ho trovato è:MPMoviePlayerViewController | Consenti modalità paesaggio

NSURL *theMovieURL = [NSURL URLWithString:self.data.trailer]; 
     if (theMovieURL) 
     { 
      self.movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:theMovieURL]; 
      [self presentMoviePlayerViewControllerAnimated:self.movieController]; 
      [self.movieController.moviePlayer play]; 
     } 

Non sono sicuro che sia il più convenzionale, ma funziona.

Il problema è che non riesco a capire come abilitare la modalità orizzontale, solo per il video. Dovrei usare qualcosa come shouldAutorotate o shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation e come?

FYI, l'intera app consente solo la modalità verticale.

Grazie per il vostro aiuto.

risposta

34

shouldAutoRotate è obsoleto a partire da iOS 6 e dovrebbe essere evitato a meno che non si stia cercando < 6.

Invece, vorrai sostituire i metodi supportedInterfaceOrientations e preferredInterfaceOrientationForPresentation.

In questo caso, se non si vuole sottoclasse il lettore multimediale è possibile eseguire l'override un metodo nel delegato applicazione in questo modo:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]]) 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    else 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 
+12

controllare se il ViewController presentato viene chiuso (proprietà BingDismissed), altrimenti il ​​viewcontroller di presentazione verrà visualizzato in landscapemode – peko

17

@peko dice modo corretto. quando l'utente esce dal video a schermo intero, questo metodo viene chiamato di nuovo con la classe MPMoviePlayerViewController. dovresti controllare se è stato rimosso o meno, se non lo fai, quando l'utente esce dal video, la finestra principale rimarrà in modalità orizzontale e anche tu hai dimenticato la classe MPInlineVideoFullscreenViewController. quando usi il player incorporato (non a schermo intero) viene chiamato con quel nome di classe.

Ho fatto così. per me funziona.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)windowx 
{ 
    if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] || 
    [[self.window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(@"MPInlineVideoFullscreenViewController")]) 
    { 
     if ([self.window.rootViewController presentedViewController].isBeingDismissed) 
     { 
      return UIInterfaceOrientationMaskPortrait; 
     } 
     else 
     { 
      return UIInterfaceOrientationMaskAllButUpsideDown; 
     } 
    } 
    else 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 
0

Il giocatore di film potrebbe non essere il primo controller di vista presentato, così si dovrebbe fare qualcosa di simile

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 
    UIViewController* playerController = self.window.rootViewController.presentedViewController; 
    while (playerController && ![playerController isKindOfClass:[MPMoviePlayerViewController class]]) { 
     playerController = playerController.presentedViewController; 
    } 
    if (playerController && !playerController.isBeingDismissed) { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } else { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Anche se MPMoviePlayerViewController è disapprovato così si dovrebbe usare AVPlayerViewController invece e verificare sua classe anche in questo ciclo.

0

Il modo migliore finora è quello di implementare questa funzione AppDelegate e verificare se il rootViewController ha un figlio di tipo AVPlayerViewController o MPMoviePlayerViewController poi tornare [.portrait, .landscapeLeft, .landscapeRight] e altro .portrait.

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    if let _ = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers.first as? AVPlayerViewController { 
     return [.portrait, .landscapeLeft, .landscapeRight] 
    } 
    return .portrait 
} 

Si dovrebbe controllare sul keyWindow di UIApplication perché Apple presenta questo viewController in un altro UIWindow quindi se si tenta di farlo controllo sulla finestra che è dichiarato nel AppDelegate questo non funzionerà quindi state attenti.

Problemi correlati