1

我对 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。

4

3 回答 3

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  

}
于 2012-04-12T21:32:27.900 回答
1

我的2美分...

UIViewControllers 呈现的视图,当连接到 UITabBarController 和 UINavigationController 时,不是静态的,而是动态的。我的意思是你必须认为用户可能会在你的视图之间切换。如果其中一些旋转而另一些不旋转,则您的 GUI 应该是混乱的,至少在 Apple 看来是这样。

于 2012-04-12T21:27:31.083 回答
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

现在,一旦实现了这个类别,自动旋转就完全由 shouldAutoRotateToInterfaceOrientation 在当前 UIViewController 中返回的任何内容决定

于 2013-08-20T16:08:17.590 回答