ios5中的自动旋转 - 失败的最常见原因是什么?

时间:2012-04-12 21:08:02

标签: ios uinavigationcontroller uitabbarcontroller orientation autorotate

我对ios中自动旋转的实施感到困惑 我有一个UIViewController,我告诉它在shouldAutoRotateToInterfaceOrientation中自动旋转。但是,它不起作用。 所以我读了一些关于如何查看导航堆栈和/或是否使用了UITabBarController的内容,因为众所周知会引起各种混淆(引发手)。

事实上,我有一个UITabBar和一个UINavigationController。我想要旋转的UIView被推入堆栈三或四级“深”。

为什么自动旋转完全不是由当前UIViewController内的shouldAutoRotateToInterfaceOrientation返回的?

来自位于:https://developer.apple.com/library/ios/#qa/qa2010/qa1688.html的苹果技术文档,了解为什么UIViewController可能无法按预期旋转:

  
    

UITabBarController或UINavigationController中的所有子视图控制器都不同意公共方向集。

  
     

要确保所有子视图控制器正确旋转,   你必须为每个实现shouldAutorotateToInterfaceOrientation   视图控制器代表每个选项卡或导航级别。每个人都必须   同意旋转发生的方向相同。就是他们   对于相同的方向位置,所有人都应该返回YES。

在使用UITabBars和UINavigationControllers时,有人可以总结一下我们需要注意的事实吗?人们通常在哪里搞乱或什么是浑浊点?

如果您有UITabBar,UITabBarController或UINavigationController,则其所有子视图都需要具有相同的自动旋转行为。但是你肯定可以让一些子视图旋转而其他人不能旋转,对吧?

我怀疑失败的常见原因与不适当地理解响应者链有关,因为它适用于自转。如果是这样,有人可以为我清除这个吗?然后我或许能够找出“选择性自转”。

要添加到此,其他帖子表明您必须继承UITabBarController并覆盖shouldAutorotateToInterfaceOrientation。

3 个答案:

答案 0 :(得分:2)

我认为你希望他们所有人都以同样的方式回应的原因是因为它让用户感到尴尬。如果您在可以旋转的特殊视图中处于横向模式,那么当您将该视图控制器弹出到导航控制器上的父控件或点击没有横向模式的选项卡时,这将是一种奇怪的体验。

我认为那是推理。

但是,如果需要,您可以捕获设备方向通知并自行处理,如果设备在您要旋转的特定视图上旋转,则可以按下新视图。

使用此:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotationDetected) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

然后创建一个函数rotationDetected来处理旋转时发生的事情......像这样:

-(void) rotationDetected {

    if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) || ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)){

    //Push on the view in landscape orientation if we aren't there already

} else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {

    //If the landscape view is present, pop it back to the portait view  

}

答案 1 :(得分:1)

我的2美分......

UIViewControllers提供的视图,当连接到UITabBarController和UINavigationController时,不是静态的,而是dinamic。我的意思是你必须认为用户可能会在你的观点之间切换。如果其中一些旋转而另一些没有旋转,那么你的GUI应该是凌乱的,至少在Apple看来。

答案 2 :(得分:0)

我遇到同样的问题希望这个解决方案可以帮助其他人,

适用于iOS 5及以下版本

实施类别以处理与标签相关联的 UINavigationControllers 的情况:

@implementation UITabBarController (AutoRotation)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

 {
          if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) 

          {
              UIViewController *rootController = [((UINavigationController *)self.selectedViewController).viewControllers lastObject];
             return [rootController shouldAutorotateToInterfaceOrientation:interfaceOrientation];

          }
         return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];

  }

@end

现在一旦实现此类别,自动旋转完全取决于当前UIViewController内的shouldAutoRotateToInterfaceOrientation返回