自动旋转在iOS 6中有奇怪的行为(Autorotate in iOS 6 has strange

2019-06-18 05:58发布

UITabBarController应用程序,它可以播放视频和显示其他等信息UITabBar标签。 在iOS 6中UIView旋转方法已经过时了,现在我需要使用shouldAutoRotatesupportedInterfaceOrientations方法。 对于视频播放我用MPMoviePlayerViewController

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

plist的设置,我只设置1肖像接口方向。 如果我设置其他 - 整个应用程序将被旋转。

Answer 1:

从苹果的iOS 6 SDK版本说明:

自转是在IOS 6改变在iOS 6中,所述shouldAutorotateToInterfaceOrientation:UIViewController中的方法已被弃用。 在其位,你应该使用supportedInterfaceOrientationsForWindow:和shouldAutorotate方法。

更多的责任正在向应用程序和应用程序的委托。 现在,iOS的容器(如UINavigationController的)不咨询自己的孩子,以确定他们是否应该自动旋转。 默认情况下,应用程序和视图控制器支持的接口方向设置为UIInterfaceOrientationMaskAll为iPad成语和UIInterfaceOrientationMaskAllButUpsideDown为iPhone成语。

视图控制器支持的接口方向可以随着时间的推移,甚至是应用程序的支持的接口方向可以随时间变化而变化。 系统要求输入其支持的接口方向最上面的全屏幕视图控制器(典型根视图控制器)每当设备旋转或每当一个视图控制器呈现全屏幕模式呈现样式。 此外,支撑取向检索仅当此视图控制器从其shouldAutorotate方法返回YES。 该系统相交视图控制器的符合该应用的支撑取向支撑取向(如由Info.plist文件或应用程序委托的应用来确定:supportedInterfaceOrientationsForWindow:方法)来确定是否旋转。

该系统确定的方位是否是由交叉的由应用的supportedInterfaceOrientationsForWindow返回的值的支持:与由最上面的全屏幕控制器的supportedInterfaceOrientations方法返回的值的方法。 该setStatusBarOrientation:动画:方法不彻底弃用。 现在它只有在最顶端的全屏视图控制器的supportedInterfaceOrientations方法返回0。这使负责确保状态栏的方向是一致的调用者。

对于兼容性,查看仍然实现shouldAutorotateToInterfaceOrientation控制器:方法没有得到新的自转行为。 (换句话说,他们不回落到使用的应用程序,应用程序的委托,或者Info.plist文件来确定支持的方向。)相反,shouldAutorotateToInterfaceOrientation:使用方法,从而合成将由supportedInterfaceOrientations方法返回的信息。

如果你希望你的整个应用程序进行旋转,那么你应该设置你的Info.plist支持所有的方向。 现在,如果你想有一个特定的视图变为纵向只有你将不得不做一些子类和覆盖自转方法只返回肖像。 我在这里有一个例子:

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



Answer 2:

Ough! 一天半时间了,问题解决了! 呵呵。

正如上面的文件说,这是真的吧! 核心要点是:

更多的责任正在向应用程序和应用程序的委托 。 现在,iOS的容器(如UINavigationController的)不咨询自己的孩子,以确定他们是否应该自动旋转。 默认情况下,应用程序和视图控制器支持的接口方向设置为UIInterfaceOrientationMaskAll为iPad成语和UIInterfaceOrientationMaskAllButUpsideDown为iPhone成语。

所以,任何时候的东西用root控制器的变化,系统会询问应用程序委托“所以,我们是什么?旋转或不呢?”

如果“旋转”:

所支持的取向被检索仅当此视图控制器从其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中只,当然)。 所以,我甚至无法作出反应,因为它发生的意外,然后单击快捷我的应用程序的其他一些元素后,它旋转到正常的方向。 所以,不知道 - 可能是在模拟器的工作什么的(或者,真的是一个错误:))一些延迟。

祝好运!



Answer 3:

我有同样的问题,我的应用程序。

在iOS 6中工作的旋转这是怎么回事。

=>当过您使用的UINavigationController在AppDelegate中的方法

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

决定是否转动与否。

=>当视图在模态呈现样式的方法被提出

- (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;
}

:此作品仅供认为是Modely主办。 标志使用,而不是一个良好的编码习惯。



Answer 4:

你也可以继承的UITabBarController使它询问其孩子有关shouldAutorotate和supportedInterfaceOrientation是这样的:

@implementation MyTabBarController

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

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

@end

然后你只需要使用您的自定义容器代替标准之一,它的作品! 刚刚测试。



Answer 5:

不幸的是,你需要打开你的plist和使用supportedInterfaceOrientations所有方向上的所有你不想旋转视图控制器。 (在你的情况一切,但视频播放器。)



Answer 6:

试试这个,

如果TabBarController是RootViewController的窗,然后创建自定义类它继承TabBarController说CustomTabBarController.h

添加以下方法CustomTabBarController.h

-(NSUInteger)supportedInterfaceOrientations // Must return Orientation Mask

最后调用下面AppDelegate.m

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  {
   if( [self.window.rootViewController supportedInterfaceOrientations]!=0) 
     {
        return [self.window.rootViewController supportedInterfaceOrientations];
    }
    return UIInterfaceOrientationMaskAll;
}


Answer 7:

我发现此设置的最简单方法是使用“支持的接口方向”按钮,它如果你看看目标....摘要选项卡(在iPhone / iPad的部署信息),你可以看到。

它基本上是一个图形用户界面来设置plist文件



文章来源: Autorotate in iOS 6 has strange behaviour