我有一个非常复杂的问题(或者我认为)。我正在研究遗留应用程序修复一些问题,并使其支持4英寸显示屏和iOS 7.问题是该应用程序的体系结构非常复杂,有几个类别和方法调整以实现自定义iOS 4.3和5中的外观和感觉。
该申请涉及金融市场和证券交易所。该应用程序仅用于纵向导航,除了几个控制器,倾斜手机会将视图更改为股票/市场的图表。整个应用有一个UINavigationController
,在很多地方都有一个UITabBarController
。在我感兴趣的控制器中,结构如下:
UINavigationController
UITabBarController
有几个UIViewControllers
UITabBarController
这个结构使用像这样工作。当手机倾斜时,我的方向控制器(同时具有shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
和图表控制器)调用UITabBarController
(这是iOS 6之前的版本),并检查selectedIndex
是否为UITabBarController
supportedInterfaceOrientations
是市场控制者或库存控制器的一个,它用横向图表视图替换视图。
在iOS 6之后,shouldAutorotate
和shouldAutorotate
被添加到我们的代码中,它也运行良好。但是,升级到XCode 5并使用iOS 7作为基础SDK构建后,UITabBarController
未在我的方向控制器上调用,但它在{{1}}和市场上都被调用/库存控制器。
任何想法?
答案 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的实现,如下所示:
答案 3 :(得分:0)
window.rootViewController
不是一个选项,因为它是与iOS 3不兼容,并且您呈现根控制器的方式是将其视图作为子视图添加到窗口,如[window addSubview:navigationController.view];
。似乎这种方式与iOS7不兼容(甚至可能是6)。视图显示,并按预期工作,除了系统没有发送方向更改并且从未尝试自动旋转导航控制器。 @ Flexicoder的解决方案有助于检测设备方向的变化,但我仍然无法正确绘制图表控制器,因为导航控制器从未旋转过。什么@Igor&由于视图添加到窗口的方式,@ Tamer提到不起作用,但在更改为iOS 4+方法之后,它起作用了。再次感谢大家。