我正在尝试在我的应用中流式传输视频。我发现的方法是:
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
之类的内容吗?
仅供参考,整个应用程序仅允许纵向模式。
感谢您的帮助。
答案 0 :(得分:34)
shouldAutoRotate
已被弃用,除非您打算使用< 6。
相反,您需要覆盖supportedInterfaceOrientations
和preferredInterfaceOrientationForPresentation
方法。
在这种情况下,如果您不想为媒体播放器创建子类,则可以覆盖app委托中的方法,如下所示:
- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]])
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
else
{
return UIInterfaceOrientationMaskPortrait;
}
}
答案 1 :(得分: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;
}
}
答案 2 :(得分: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;
}
}
虽然{@ 1}}已被弃用,但您应该使用MPMoviePlayerViewController
代替并在此循环中检查其类。
答案 3 :(得分:0)
到目前为止,最好的方法是实现此AppDelegate函数并检查rootViewController
是否有AVPlayerViewController
或MPMoviePlayerViewController
类型的子项,然后返回[.portrait, .landscapeLeft, .landscapeRight]
和其他{ {1}}。
.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
}
的{{1}},因为Apple会在另一个keyWindow
中显示此viewController,因此如果您尝试对UIApplication
中声明的窗口进行检查1}}这不会起作用所以要小心。