我有一些奇怪的行为,MPMoviePlayerViewController
不是auto
- 在orientation
更改时会轮换。但是,我在一个新项目中重新创建了相同的视图层次结构,当MPMoviePlayerViewController
播放器启动时,它会旋转到每个方向。我已经仔细研究了这个项目,寻找可能明确设定方向的任何东西,但没有任何东西。
我将在此列出所有相关信息以及迄今为止我尝试过的事情。
视图层次结构目前如下所示:
视图层次结构中的每个类都响应shouldAutorotateToInterfaceOrientation,仅对UIInterfaceOrientationPortrait使用YES。
我尝试过的事情:
shouldAutorotateToInterfaceOrientation
堆栈到MPMoviePlayerViewController
MPMoviePlayerViewController
的{{1}}子类'实现,为所有方向的横向方向和 YES返回YES。shouldAutorotateToInterfaceOrientation
,例如Feed VC 如果电影播放器在具有相同视图层次结构的新项目中正确旋转,那么可能会遇到什么问题。关于方向可能会被卡住的任何想法?
答案 0 :(得分:7)
我建议您不要使用presentMoviePlayerViewControllerAnimated
,而不是添加为子视图。我认为它会很好地解决你的问题。
MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc]
initWithContentURL:[NSURL fileURLWithPath:self.filePath]];
[self.view addSubview:mpviewController.view];
[self setWantsFullScreenLayout:YES];
在检测到mpviewController.view
时移除MPMoviePlayerPlaybackDidFinishNotification
。让我看看你的成功......
答案 1 :(得分:3)
我发现MPMoviePlayerViewController
个对象将遵循项目的Info.plist设置以获得支持的界面方向。在我的一个项目中,我只允许该文件中的横向视图,因此电影播放器不会旋转,即使它在YES
中回答shouldAutorotateToInterfaceOrientation:
到横向方向。
编辑:好的,抓住吸管:你是否在任何automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
子类中实现了UIViewController
?如果是,并返回NO
,则子类必须在方向更改时将适当的方法转发给任何子控制器。
否则有什么办法可以看到你的代码?
答案 2 :(得分:2)
我知道这可能是一个愚蠢的建议,但要确保调用shouldAutorotateToInterfaceOrientation
子类中的MPMoviePlayerViewController
方法。也许那里出了点问题...
另外,请确保您没有按照指定here将2个子视图添加到主UIWindow
:
问:为什么我的UIViewController不会随设备一起旋转?
[...]
- 视图控制器的UIView属性嵌入在UIWindow中,但是 另外还有一个视图控制器。
我认为这也可能会给你一些问题。您可以在上面的链接中找到有关可能出现问题的更多信息。
答案 3 :(得分:1)
一些想法:
UINavigationController
是否设为应用rootViewController
的{{1}}属性?你没有提到这一点。您应该这样做,而不是将导航控制器的视图添加到窗口。UIWindow
一个接一个地推送UINavigationController
中的两个视图控制器。您可能有类似的问题。答案 4 :(得分:1)
<强>解决方案:强>
对于任何可能遇到这种情况的人来说,视频没有旋转的原因是我不小心添加了RootViewController,它有窗口的rootViewController,而不是UINavigationController。
self.window.rootViewController = navController;
是正确的
self.window.rootViewController = rootViewController;
不是
谢谢你们的帮助和一路投入。
答案 5 :(得分:0)
你在使用故事板吗?比较破坏的项目和测试项目之间的UIViewControllers和UINavigationController的方向设置。属性检查器上的“方向”设置可能会将您锁定在一个方向。
你提到shouldAutorotateToInterfaceOrientation:
和你的plist设置所以我不会进入那个......
答案 6 :(得分:0)
您的查询背后有一些原因..
***您正在调用MPMoviePlayerViewController
..因此在"Feed" View Controller
上应用AutoOrientation并尝试通过PushViewController调用..
***使用MPMoviePlayerController
代替MPMoviePlayerViewController
,并将子视图添加到FeedViewController
..
MPMoviePlayerController的示例代码 -
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"type"]];
videoPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
videoPlayer.controlStyle = MPMovieControlStyleNone;
videoPlayer.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width);
[videoPlayer prepareToPlay];
videoPlayer.view.center = self.view.center;
videoPlayer.fullscreen = YES;
[self.view addSubview:videoPlayer.view];
[videoPlayer play];
***检查您的Xcode目标设置并应用启用所有方向..
答案 7 :(得分:0)
你应该试试这个(为我工作):
在.h文件中声明:
BOOL landscape;
.m文件:
-(IBAction)PlayMovie:(NSString *)movieName {
landscape = YES;
NSBundle *bundle = [NSBundle mainBundle];
NSString *moviePath = [bundle pathForResource:movieName ofType:@"mp4"];
NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
theMovie.scalingMode = MPMovieScalingModeAspectFill;
[theMovie play];
MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
}
-(void)dismissMoviePlayerViewControllerAnimated {
landscape = NO;
[self dismissModalViewControllerAnimated:YES];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// You can change the return for your needs.
if (landscape == YES) {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} else { return NO; }
}
我在这里做的是创建我的电影视图并将“landscape”BOOL设置为YES。
然后“shouldAutorotateToInterfaceOrientation”会检测到这一点并自动调整您的视图。
当电影结束时,我将“风景”设置为“否”,以便视图旋转回来。
答案 8 :(得分:0)
我遇到了类似的问题。
解决方案:
现在你的应用程序将开始在所有方向旋转,如果你不想要这个,那么跳过步骤1,只在appDelegate中添加以下方法
将aAutorotateToInterfaceOrientation移到任何地方
添加以下方法来查看控制器,以支持您的应用所需的方向
您可以在MPMoviePlayerViewController的子类中添加与步骤4中相同的方法,用于视频播放器所需的任何方向
答案 9 :(得分:0)
本指南帮助我检查了一些我缺少的步骤,以便只允许以横向方式查看视频播放器,让应用程序的其余部分以纵向模式修复:
答案 10 :(得分:0)
我对MPMoviePlayerViewController感到很痛苦,它应该只能控制器从纵向旋转到横向,反之亦然。它是带故事板的iOS7,iOS8应用程序。
这是解决方案:
每个需要支持肖像模式的UIViewController都应该实现下一个方法,比如
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
应该扩展MPMoviePlayerViewController,并且应该像这样重写下一个方法
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
使用presentMoviePlayerViewControllerAnimated
显示MPMoviePlayerViewController
答案 11 :(得分:0)
在AppDelegate.m中添加此方法
- (NSUInteger)应用程序:(UIApplication *)应用程序supportedInterfaceOrientationsForWindow:(UIWindow *)窗口 {
if(!ISIPAD)
{
if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed])
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
else
{
return UIInterfaceOrientationMaskPortrait;
}
}
return UIInterfaceOrientationMaskAllButUpsideDown ;
}