2013-06-24 6 views
19

Ich versuche ein Video in meiner App zu streamen. Die Methode, die ich gefunden habe, ist:MPMoviePlayerViewController | Querformat zulassen

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

Ich bin mir nicht sicher, ob es die meisten konventionellen, aber es funktioniert.

Das Problem ist, dass ich nicht herausfinden kann, wie Sie den Landschaftsmodus nur für das Video zulassen. Sollte ich etwas wie shouldAutorotate oder shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation verwenden, und wie?

FYI, die gesamte App ermöglicht nur den Hochformat-Modus.

Danke für Ihre Hilfe.

Antwort

34

shouldAutoRotate ist ab iOS 6 veraltet und sollte vermieden werden, es sei denn, Sie gehen für < 6.

Stattdessen sollten Sie die Methoden supportedInterfaceOrientations und preferredInterfaceOrientationForPresentation außer Kraft setzen.

In diesem Fall, wenn Sie den Media-Player nicht zu Unterklasse wünschen kann man wie so ein Verfahren, in dem AppDelegate außer Kraft setzen:

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

Überprüfen Sie, ob der presentedViewController beendet wird (isBeingDismissed-Eigenschaft), andernfalls wird der presenting viewcontroller im Querformat angezeigt – peko

17

@peko korrekte Art und Weise sagt. Wenn der Benutzer das Vollbildvideo beendet, ruft diese Methode erneut die Klasse MPMoviePlayerViewController auf. Sie sollten überprüfen, ob es nicht funktioniert oder nicht, wenn Sie dies nicht tun, wenn der Benutzer das Video verlässt, bleibt das Hauptfenster im Querformat und Sie haben MPInlineVideoFullscreenViewController vergessen. Wenn Sie den Player einbetten (nicht Vollbild), wird er mit diesem Klassennamen aufgerufen.

Ich habe es so gemacht. Für mich geht das.

- (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

Der Movie-Player ist vielleicht nicht die erste präsentierte View-Controller, so dass Sie so etwas wie dieses

- (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; 
    } 
} 

Obwohl MPMoviePlayerViewController veraltet ist tun sollten, damit Sie AVPlayerViewController statt und überprüfen Sie die Klasse verwenden, sollte auch in diese Schleife.

0

Der beste Weg ist so weit diese AppDelegate Funktion zu implementieren und überprüfen, ob die rootViewController ein Kind vom Typ hat AVPlayerViewController oder MPMoviePlayerViewController dann kehren Sie zurück [.portrait, .landscapeLeft, .landscapeRight] und sonst .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 
} 

Sie sollten auf die keyWindow von UIApplication überprüfen, da Apple diese Viewcontroller in einem so andere UIWindow präsentiert, wenn Sie versuchen, die Kontrolle über das Fenster zu tun, die in den AppDelegate deklariert ist dies nicht so vorsichtig sein, funktionieren wird.

Verwandte Themen