iOS 6中的自动旋转具有奇怪的行为

Tim*_*aev 28 iphone objective-c mpmovieplayercontroller ios ios6

我有UITabBarControllerapp播放视频并在其他UITabBar标签中显示其他信息.在iOS 6中,UIView不推荐使用旋转方法,现在我需要使用shouldAutoRotatesupportedInterfaceOrientations方法.对于视频播放,我使用MPMoviePlayerViewController.

如何仅旋转此播放器视图?我只能旋转整个应用程序,但不想这样做.我提出MPMoviePlayerViewController但它不像iOS 5及更早版本那样旋转.

plist设置中我只设置了1个人像界面方向.如果我设置其他 - 整个应用程序将被轮换.

roc*_*cky 45

来自Apple的iOS 6 SDK发行说明:

iOS 6中的自动旋转正在发生变化.在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:方法.取而代之的是,您应该使用supportedInterfaceOrientationsForWindow:和shouldAutorotate方法.

更多的责任转移到应用程序和应用程序代表.现在,iOS容器(例如UINavigationController)不会咨询他们的孩子以确定他们是否应该自动旋转.默认情况下,应用程序和视图控制器支持的界面方向设置为iPad惯用语的UIInterfaceOrientationMaskAll和iPhone惯用语的UIInterfaceOrientationMaskAllButUpsideDown.

视图控制器支持的界面方向可能会随着时间的推移而变化 - 即使应用程序支持的界面方向也会随着时间的推移而变化.无论何时设备旋转或每当视图控制器呈现全屏模态呈现样式时,系统都要求最顶层的全屏视图控制器(通常是根视图控制器)获得其支持的界面方向.此外,仅当此视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向.系统将视图控制器支持的方向与应用程序支持的方向(由Info.plist文件或应用程序委托的应用程序:supportedInterfaceOrientationsForWindow:方法确定)相交,以确定是否旋转.

系统通过将应用程序的supportedInterfaceOrientationsForWindow:方法返回的值与最顶层全屏控制器的supportedInterfaceOrientations方法返回的值相交来确定是否支持方向.setStatusBarOrientation:animated:方法不会被完全弃用.它现在只有在最顶层的全屏视图控制器的supportedInterfaceOrientations方法返回0时才有效.这使得调用者负责确保状态栏方向一致.

为了兼容性,仍然实现shouldAutorotateToInterfaceOrientation:方法的视图控制器不会获得新的自动旋转行为.(换句话说,它们不会回退到使用app,app delegate或Info.plist文件来确定支持的方向.)而是使用shouldAutorotateToInterfaceOrientation:方法来合成将由supportedInterfaceOrientations方法返回的信息. .

如果您希望整个应用程序旋转,那么您应该设置Info.plist以支持所有方向.现在,如果您希望特定视图仅为纵向,则必须执行某种子类并覆盖自动旋转方法以仅返回纵向.我在这里有一个例子:

/sf/answers/876548361/


Aga*_*gat 13

Ough!花了半天时间,问题解决了!呵呵.

正如上面的文档所说,这就是它!核心要点是:

更多的责任转移到应用程序和应用程序代表.现在,iOS容器(例如UINavigationController)不会咨询他们的孩子以确定他们是否应该自动旋转.默认情况下,应用程序和视图控制器支持的界面方向设置为iPad惯用语的UIInterfaceOrientationMaskAll和iPhone惯用语的UIInterfaceOrientationMaskAllButUpsideDown.

因此,无论何时根控制器发生变化,系统都要求应用代表"那么,我们是什么?旋转与否?"

如果"旋转":

仅当此视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向

然后系统要求我们的应用代表

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

    return ...;
}
Run Code Online (Sandbox Code Playgroud)

这真的很简单.

如何确定我们何时应该允许纵向或横向等 - 取决于您.由于某些问题,对根控制器的测试对我来说不起作用,但这有效:

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

    return self.fullScreenVideoIsPlaying ?
        UIInterfaceOrientationMaskAllButUpsideDown :
        UIInterfaceOrientationMaskPortrait;
}
Run Code Online (Sandbox Code Playgroud)

我需要的时候手动设置属性"fullScreenVideoIsPlaying".

唯一需要注意的重要事项是枚举.正如它在文档中所说的那样......(仔细阅读iPad/iPhone上面的内容).所以,你可以根据需要玩这些.

关闭播放器控制器后,另一个小问题是一些错误的行为.有一次它没有改变方向,但是这种情况发生过一次并以某种奇怪的方式发生,并且只在模拟器中发生(当然只有iOS 6).所以我甚至无法做出反应,因为它意外地发生了,并且在快速点击我的应用程序的其他一些元素后,它旋转到正常方向.所以,不确定 - 可能是模拟器工作或某事的延迟(或者,真的是一个错误:)).

祝好运!


Vip*_*ney 7

我的应用程序遇到了同样的问题.

iOS 6中的旋转是如何工作的.

=>当你在AppDelegate中使用UINavigationCOntroller方法时

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window    
{
   return 
}
Run Code Online (Sandbox Code Playgroud)

决定是否旋转.

=>当视图以Modal表示样式呈现时的方法

- (BOOL)shouldAutorotate
Run Code Online (Sandbox Code Playgroud)

在该视图的viewController内部触发appDelegate中的方法.并且作为第一种情况,appDelegate决定是否旋转.

我的方案::

我为Modal演示所做的是.在app delegate中创建了一个标志.

当标志为YES时,它会旋转到横向,而其它只有纵向.

- (NSUInteger)application:(UIApplication*)application
supportedInterfaceOrientationsForWindow:(UIWindow*)window
{
    if(self.shouldRotate ) //shouldRotate is my flag
    {
        self.shouldRotate = NO;
        return (UIInterfaceOrientationMaskAll);
    }
    return (UIInterfaceOrientationMaskPortrait);
}
Run Code Online (Sandbox Code Playgroud)

并在旋转之间切换

- (BOOL)shouldAutorotate
{
    YourAppDelegate *mainDelegate = (YourAppDelegate*)[[UIApplication sharedApplication]delegate];
    mainDelegate.shouldRotate = YES;

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

注意:此作品仅适用于模式呈现的视图.使用Flag,不是一个好的编码实践.