gpt4 book ai didi

objective-c - 如何使 MPMoviePlayerViewController 以横向模式启动但仍允许更改方向

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:14 25 4
gpt4 key购买 nike

这里有很多问题涉及将电影播放锁定为横向模式,或支持使用 MPMoviePlayerViewController 或 MPMoviePlayerController 横向播放电影。我已经拥有横向/纵向功能,而且我不想将播放锁定为任何一种模式。

我所拥有的是按照文档建议使用 MPMoviePlayerViewController 的代码,本质上:

    MPMoviePlayerViewController* movieViewController =         [[MPMoviePlayerViewController alloc] initWithContentURL:url];    [parentViewController presentMoviePlayerViewControllerAnimated:movieViewController];

我的应用主要锁定为纵向模式,但此代码在其自己的 View 中以模态方式呈现电影 Controller ,并支持纵向和横向。所有这些都非常好。

不过这是我的问题。我将展示的 99% 的视频都是横向视频,上面的代码以纵向模式启动电影播放,因为用户(很可能)以纵向模式握住设备。

我想要的是原生 YouTube 应用程序的行为;当您呈现电影 Controller 时,它首先以横向模式呈现,这将提示用户更改其设备的方向。如果他们以后想将其旋转回纵向,则可以这样做。当电影完成(或关闭)时,电影 View Controller 将关闭,设备应处于纵向模式。

似乎无法正确隐藏状态栏(它与全屏控件相关联,无论启动电影之前'hideStatusBar'的状态如何),因此似乎也需要将状态栏放在正确的位置成为其中的一部分。

编辑以添加状态栏方向的调试说明:如果我在启动电影之前调用 setStatusBarOrientation:UIInterfaceOrientationLandscapeRight,状态栏位于正确的位置,但系统不再以相同的方式调用 shouldAutorotateToInterfaceOrientation

如果我不调用 setStatusBarOrientation,在电影出现之前我会得到以下调用序列:

shouldAutorotateToInterfaceOrientation(Portrait)shouldAutorotateToInterfaceOrientation(Portrait)shouldAutorotateToInterfaceOrientation(Portrait)shouldAutorotateToInterfaceOrientation(Right)shouldAutorotateToInterfaceOrientation(Portrait)

我只对 Right 回答 YES,电影在 LandscapeRight 中启动,但状态栏在错误的位置。设备方向的后续更改会准确生成您期望的 shouldAutorotateToInterfaceOrientation 调用(例如,如果我旋转到纵向,它会询问我是否可以旋转到纵向)。

如果我调用 setStatusBarOrientation:UIInterfaceOrientationLandscapeRight,我会得到以下序列:

shouldAutorotateToInterfaceOrientation(Right)shouldAutorotateToInterfaceOrientation(Right)

我对这两个问题的回答都是肯定的。状态栏位于正确的位置,但我不再收到询问纵向模式的 shouldAutorotateToInterfaceOrientation 电话。因此,如果我将设备向右旋转,然后回到纵向,然后再向右旋转,我会看到它调用 shouldAutorotateToInterfaceOrientation(Right) 两次。更奇怪的是,如果我将它一直旋转到左方向,我会得到 shouldAutorotateToInterfaceOrientation(Left) 从那时起一切正常。哪个最烦人。

我认为这一定是 iOS 端的一个错误,这就是为什么 YouTube 应用程序不使用动画 UI 旋转效果的原因。相反,它会隐藏全屏控件(包括状态栏),在后台不可见地旋转,然后重新显示控件。

最佳答案

我建议设置一个计时器;在 shouldAutorotateToInterfaceOrientation: 一开始只允许横向(这将强制旋转到横向),然后在(比如)5 秒后,允许所有方向。

首先,您需要继承 MPMoviePlayerViewController 或在其自己的 View 中创建一个 MPMoviePlayerController。额外的代码看起来像这样:

// On load, init or similar method
BOOL showLandscapeOnly = YES;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@(allowAllOrientations) userInfo:nil repeats:NO];

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if (showLandscapeOnly == YES)
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
interfaceOrientation == UIInterfaceOrientationLandscapeRight);
else
return YES;
}

- (void)allowAllOrientations {
showLandscapeOnly = NO;
}

我认为这将完全满足您的需求;在显示模态视频 Controller 时,它会将方向翻转为横向,因为这是唯一受支持的方向。但是,如果用户将其恢复为纵向,它就会正常响应。

您也可以尝试尝试其他时间间隔;也许2秒会更好?建议你看看测试用户主题做了什么。他们可能会很快地旋转设备。

希望对您有所帮助!

关于objective-c - 如何使 MPMoviePlayerViewController 以横向模式启动但仍允许更改方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com