用于 youtube 嵌入式视频的 iOS 6.0+ 自动旋转

Posted

技术标签:

【中文标题】用于 youtube 嵌入式视频的 iOS 6.0+ 自动旋转【英文标题】:iOS 6.0+ autorotation for youtube embedded video 【发布时间】:2013-05-02 20:53:04 【问题描述】:

我只想在我的 ios 应用程序的所有视图控制器中支持垂直方向。 However, I embed a YouTube video in one of my view controllers, and when that video is selected to take up the full screen, I want the user to be able to orient his/her phone horizo​​ntally so the video expands to take the full screen .

编辑:我尝试使用来自Autorotate in iOS 6 has strange behaviour 的以下代码:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

return self.fullScreenVideoIsPlaying ?
    UIInterfaceOrientationMaskAllButUpsideDown :
    UIInterfaceOrientationMaskPortrait;

在呈现UIWebView/YouTube 框架的视图控制器中,我的viewDidLoad 中有此代码:

[[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(windowNowVisible:)
     name:UIWindowDidBecomeVisibleNotification
     object:self.view.window
];

- (void)windowNowVisible:(NSNotification *)notification

    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    appDelegate.fullScreenVideoIsPlaying = !(appDelegate.fullScreenVideoIsPlaying);

但是,当用户在全屏 YouTube 视频上按下完成时,如果他/她仍然将手机水平放置,那么当前视图控制器也保持水平(我希望当前视图控制器是纵向的)。这是fullSreenVideoIsPlaying 变量的竞赛,它的更新速度不够快,因此我的呈现视图控制器是纵向的。

我们将不胜感激任何有关如何实现这一目标的反馈。

谢谢!

【问题讨论】:

你可以阅读-buddingdevelopers.com/autorotation-in-ios这里清楚地解释了自动旋转。 可能重复:***.com/questions/13580753/… 【参考方案1】:

通过将我在 *** 上找到的一些解决方案组合在一起,找到了一个解决方案。

不使用此通知

 [[NSNotificationCenter defaultCenter]
      addObserver:self
      selector:@selector(windowNowVisible:)
      name:UIWindowDidBecomeVisibleNotification
      object:self.view.window
 ];

我使用以下通知

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

与实现

 -(void) youTubeStarted:(NSNotification*) notif 
     AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
     appDelegate.fullScreenVideoIsPlaying = YES;

 -(void) youTubeFinished:(NSNotification*) notif 
     AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
     appDelegate.fullScreenVideoIsPlaying = NO;
 

在我的 AppDelegate 中,我有

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

在我的视图控制器中,我有

 -(BOOL) shouldAutorotate 
     return NO;
 
 -(NSUInteger)supportedInterfaceOrientations
     return UIInterfaceOrientationMaskPortrait;
 
 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
     return UIInterfaceOrientationPortrait;
 

【讨论】:

请记住,使用私人通知(UIMoviePlayerControllerDidEnterFullscreenNotificationUIMoviePlayerControllerWillExitFullscreenNotification)可能会在未来的 iOS 版本中中断或导致 App Store 拒绝。 好的,谢谢!你知道我可以使用任何其他通知吗? 不幸的是,从 iOS 6 开始,SDK 不提供任何功能。 我最终做的是在委托方法中返回 UIInterfaceOrientationMaskAllButUpsideDown,然后子类化 UITabBarController(我的根视图控制器)以在 -supportedInterfaceOrientations 中返回 UIInterfaceOrientationMaskPortrait。这样视频就可以横屏播放了,但是标签栏控制器的所有子视图控制器都只支持竖屏。 我怎样才能只拍人像?【参考方案2】:

我之前也遇到过同样的问题,我能找到的在 iOS 5.x 和 6.x 下工作的最佳解决方案是在模态视图中显示视频控制器。

模态视图是一个UINavigationController,它封装了视频控制器并在supportedInterfaceOrientations 中以UIInterfaceOrientationMaskAll 响应。在模态视图的viewWillAppear: 中,我将fullScreenVideoIsPlaying 翻转为YES,并将其设置为viewWillDisappear: 中的NO。这种安排将使底层视图控制器保持纵向,同时允许模态视图按照用户认为合适的方式旋转。

【讨论】:

感谢您的回复..有一个快速的后续问题。现在,我的 youtube 视频 UIWebView 是我呈现视图控制器中间的一个小单元 (200x100)。选择播放时,如何在模态视图控制器中呈现视频?换句话说,如何获得用户按下 UIWebView 中的播放按钮的回调? 来自网络视图的视频播放器将尊重其父级的旋转设置,因此您必须将“呈现视图控制器”设为模态视图。 我了解视频播放器会尊重其父级的轮播设置;但是,我的问题是我不希望当前视图控制器能够水平旋转。只有它呈现的视频播放器才能水平旋转 具体来说,如何“在模态视图中呈现视频控制器”?有没有办法获得指向视频控制器的指针? 不幸的是,没有办法获得对 Web 视图的 MPMoviePlayerController 的引用,我的意思是在包含 200x100 Web 视图的视图控制器中的控制器。您可以在模态控制器中显示全尺寸 UIWebView 并让它自动播放 (mediaPlaybackRequiresUserAction = NO)。

以上是关于用于 youtube 嵌入式视频的 iOS 6.0+ 自动旋转的主要内容,如果未能解决你的问题,请参考以下文章

测量在 iOS 中内联播放的嵌入式 YouTube 视频的音频电平

ionic 嵌入式 youtube 视频停止在 iOS 上播放

iOS 8 youtube 视频嵌入

来自 YouTube 的嵌入式 360 度视频无法在 iOS 浏览器上正确播放

php 用于嵌入YouTube视频的短代码

Phonegap / Cordova Youtube 在 iOS 上嵌入视频不起作用