2013-06-24 109 views
19

我想在我的應用程序中流式傳輸視頻。我發現的方法是:MPMoviePlayerViewController |允許橫向模式

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

我不確定它是最傳統的,但它的工作原理。

問題是,我不知道如何只允許視頻橫向模式。我應該使用類似shouldAutorotate還是shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation,以及如何?

僅供參考,整個應用程序只允許肖像模式。

感謝您的幫助。

回答

34

shouldAutoRotate從iOS 6開始已棄用,應該避免使用,除非您打算使用< 6。

相反,您應該覆蓋supportedInterfaceOrientationspreferredInterfaceOrientationForPresentation方法。

在這種情況下,如果你不想子類的媒體播放器,你可以在應用程序委託覆蓋一個方法,像這樣:

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

檢查presentViewController是否被解散(isBeingDismissed屬性),否則呈現viewcontroller將顯示在landscapemode – peko

17

@peko說,正確的方法。當用戶從全屏視頻中退出時,此方法將以類別MPMoviePlayerViewController再次調用。你應該檢查它是否被解僱,如果你不這樣做,當用戶退出視頻時,主窗口將保持橫向模式,並且你忘記了MPInlineVideoFullscreenViewController課程。當你使用嵌入式播放器(不是全屏)時,它被稱爲該類名稱。

我是這樣做的。這個對我有用。

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

的電影播放器​​可能不是第一次提出視圖控制器,所以你應該做這樣的事情

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

雖然MPMoviePlayerViewController已被棄用,所以你應該使用AVPlayerViewController,而不是太檢查其類這個循環。

0

到目前爲止,最好的辦法就是實現這個功能的AppDelegate和檢查rootViewControllerAVPlayerViewController型或MPMoviePlayerViewController的孩子,那麼你回到[.portrait, .landscapeLeft, .landscapeRight]和其他.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 
} 

你應該對UIApplicationkeyWindow檢查,因爲蘋果提出這個的viewController在另一UIWindow所以如果你嘗試這樣做,聲明在AppDelegate這是不行的,所以要小心窗口該檢查。