用于 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 horizontally 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;
【讨论】:
请记住,使用私人通知(UIMoviePlayerControllerDidEnterFullscreenNotification
和 UIMoviePlayerControllerWillExitFullscreenNotification
)可能会在未来的 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 上播放