28

我有UITabBarController播放视频并在其他选项卡中显示其他信息的应用程序UITabBar。在 iOS 6UIView中旋转方法已被弃用,现在我需要使用shouldAutoRotatesupportedInterfaceOrientations方法。对于视频播放,我使用MPMoviePlayerViewController.

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

plist设置中,我只设置了 1 个纵向界面方向。如果我设置其他 - 整个应用程序将被旋转。

4

7 回答 7

45

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

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

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

视图控制器支持的界面方向会随着时间而改变——甚至应用程序支持的界面方向也会随着时间而改变。每当设备旋转或视图控制器以全屏模式呈现样式呈现时,系统都会向最顶层的全屏视图控制器(通常是根视图控制器)询问其支持的界面方向。此外,仅当此视图控制器从其 shouldAutorotate 方法返回 YES 时,才会检索支持的方向。系统将视图控制器支持的方向与应用支持的方向(由 Info.plist 文件或应用委托的 application:supportedInterfaceOrientationsForWindow: 方法确定)相交以确定是否旋转。

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

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

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

https://stackoverflow.com/a/12522119/1575017

于 2012-09-21T21:49:12.850 回答
13

哎呀!用了半天,问题解决了!呵呵。

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

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

所以,每当根控制器发生变化时,系统都会询问应用程序委托“那么,我们是什么?旋转与否?”

如果“旋转”:

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

然后系统要求我们的应用委托

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

    return ...;
}

这真的很简单。

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

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

    return self.fullScreenVideoIsPlaying ?
        UIInterfaceOrientationMaskAllButUpsideDown :
        UIInterfaceOrientationMaskPortrait;
}

每当我需要时,我都会手动设置属性“fullScreenVideoIsPlaying”。

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

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

祝你好运!

于 2012-11-07T23:01:52.710 回答
7

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

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

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

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

决定是否旋转。

=> 当视图以 Modal 呈现方式呈现时,方法

- (BOOL)shouldAutorotate

它位于该视图的 viewController 内,触发了 appDelegate 中的方法。作为第一种情况,appDelegate 决定是否轮换。

我的解决方案::

我为模态演示所做的就是这样。在应用程序委托中创建了一个标志。

当标志为“是”时,它会旋转为横向,否则它会旋转为唯一的纵向。

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

并在旋转之间切换

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

    return YES;
}

注意:这仅适用于模型呈现的视图。使用标志,不是一个好的编码习惯。

于 2012-11-29T13:01:08.130 回答
3

您还可以继承 UITabBarController 以使其向其子级询问 shouldAutorotate 和 supportedInterfaceOrientation ,如下所示:

@implementation MyTabBarController

-(BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

@end

然后,您只需使用自定义容器代替标准容器即可!刚刚测试。

于 2013-01-03T15:48:55.837 回答
2

不幸的是,您需要打开 plist 中的所有方向,并在您不想旋转的所有视图控制器上使用 supportedInterfaceOrientations。(在您的情况下,除了视频播放器之外的所有内容。)

于 2012-09-22T00:56:35.897 回答
1

Try this,

If TabBarController is RootViewController for window, Then Create Custom Class which inherits TabBarController say CustomTabBarController.h

Add Below method in CustomTabBarController.h

-(NSUInteger)supportedInterfaceOrientations // Must return Orientation Mask

Finally Call Below in AppDelegate.m

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  {
   if( [self.window.rootViewController supportedInterfaceOrientations]!=0) 
     {
        return [self.window.rootViewController supportedInterfaceOrientations];
    }
    return UIInterfaceOrientationMaskAll;
}
于 2013-01-28T11:00:02.660 回答
0

我发现设置它的最简单方法是使用“支持的界面方向”按钮,如果您查看 Targets....Summary 选项卡(在 iPhone/iPad 部署信息下),您可以看到这些按钮。

它基本上是一个用于设置 plist 文件的 GUI

于 2012-10-31T13:30:32.453 回答