supportedInterfaceOrientations不在我的控制器中调用

时间:2014-03-23 13:28:32

标签: ios iphone objective-c xcode5 orientation

我有一个非常复杂的问题(或者我认为)。我正在研究遗留应用程序修复一些问题,并使其支持4英寸显示屏和iOS 7.问题是该应用程序的体系结构非常复杂,有几个类别和方法调整以实现自定义iOS 4.3和5中的外观和感觉。

该申请涉及金融市场和证券交易所。该应用程序仅用于纵向导航,除了几个控制器,倾斜手机会将视图更改为股票/市场的图表。整个应用有一个UINavigationController,在很多地方都有一个UITabBarController。在我感兴趣的控制器中,结构如下:

  • UINavigationController
    • 方向控制器,如果方向改变,则更改视图
      • UITabBarController有几个UIViewControllers
        • UITabBarController
        • 第一个广告位中的市场/股票控制器
      • 图表控制器

这个结构使用像这样工作。当手机倾斜时,我的方向控制器(同时具有shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation和图表控制器)调用UITabBarController(这是iOS 6之前的版本),并检查selectedIndex是否为UITabBarController supportedInterfaceOrientations是市场控制者或库存控制器的一个,它用横向图表视图替换视图。

在iOS 6之后,shouldAutorotateshouldAutorotate被添加到我们的代码中,它也运行良好。但是,升级到XCode 5并使用iOS 7作为基础SDK构建后,UITabBarController未在我的方向控制器上调用,但它在{{1}}和市场上都被调用/库存控制器。

任何想法?

4 个答案:

答案 0 :(得分:2)

对导航控制器进行子类化并覆盖方法:

// CustomNavigationController.m

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

然后将shouldAutorotate方法添加到应该旋转的viewcontroller并返回YES:

// ViewController.m

- (BOOL)shouldAutorotate {
    return YES;
}

答案 1 :(得分:1)

您的迎新控制器可以挂钩UIDeviceOrientationDidChangeNotification Apple Docs

  

您还可以使用UIDevice实例来检测设备特征的变化,例如物理方向。您可以使用orientation属性获取当前方向,也可以通过注册UIDeviceOrientationDidChangeNotification通知来接收更改通知。在使用这些技术之一获取方向数据之前,必须使用beginGeneratingDeviceOrientationNotifications方法启用数据传递。当您不再需要跟踪设备方向时,请调用endGeneratingDeviceOrientationNotifications方法以禁用通知的传递。

答案 2 :(得分:1)

我认为这里的问题如果在UINavigationController中实现shouldAutorotate是这样的: - (BOOL)shouldAutorotate {     return [self.topViewController shouldAutorotate]; }

那么你应该期望调用topViewController的shouldAutorotate。

1-确保调用UINavigationController的shouldAutorotate(预期是)。

2-如果第一个点的答案是肯定的,那么检查topViewController的类型,如果它不是OrientationController(也是预期的也是),那么这就是问题。

所以,如果这是问题,修复将改变自定义UINavigationController中的shouldAutorotate的实现,如下所示:

  • (BOOL)shouldAutorotate { for(UIViewController * self.viewControllers中的控制器){     if([controller isKindOfClass:[OrientationController class]]){         [控制器应该是Autorotate];     } } }

答案 3 :(得分:0)

好吧,我的问题有点不同寻常。正如我在问题中所提到的,该应用程序是一个遗留应用程序,当iOS 4很新时,它被写回来了,它曾用于支持iOS 3.当时,window.rootViewController不是一个选项,因为它是与iOS 3不兼容,并且您呈现根控制器的方式是将其视图作为子视图添加到窗口,如[window addSubview:navigationController.view];。似乎这种方式与iOS7不兼容(甚至可能是6)。视图显示,并按预期工作,除了系统没有发送方向更改并且从未尝试自动旋转导航控制器。 @ Flexicoder的解决方案有助于检测设备方向的变化,但我仍然无法正确绘制图表控制器,因为导航控制器从未旋转过。什么@Igor&由于视图添加到窗口的方式,@ Tamer提到不起作用,但在更改为iOS 4+方法之后,它起作用了。再次感谢大家。