我仍在寻找一种更优雅的方式来处理这个问题,但我将分享一个对我有用的小技巧。如果你发现更好的东西,请告诉我。
在具有复杂导航树的应用程序中对我来说效果不错的一种方法是,如果您的应用程序中没有导航控制器,则为第一个导航控制器或第一个视图控制器安装自定义子类。那就是将接收 shouldAutoRotate 调用的那个。
听起来你已经这样做了。
现在您需要在 shouldAutoRotate 部分插入您自己的逻辑。如果视图控制器应该自动旋转,我所做的是在 appDelegate 中使用 BOOL 作为存储位置。基本上它是这样工作的:
应用删除:
@property (nonatomic,assign) BOOL allowAutoRotationForThisViewController;
堆栈顶部的自定义导航控制器:
- (BOOL)shouldAutorotate {
AppDelegate *a = [[UIApplication sharedApplication] delegate];
return a.allowAutoRotationForThisViewController;
}
可旋转视图控制器:
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
AppDelegate *a = [[UIApplication sharedApplication] delegate];
a.allowAutoRotationForThisViewController = YES:
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
AppDelegate *a = [[UIApplication sharedApplication] delegate];
a.allowAutoRotationForThisViewController = NO:
}
我不确定他们为什么在 ios6 中更改了这一点,这似乎要困难得多,尤其是当您有复杂的导航结构时。我在堆栈顶部有一个带有“幻灯片”类型控制器的应用程序,一个标签栏控制器和一堆导航控制器。试图通过所有这些来获得堆栈底部的 Web 视图以进行旋转,或者让它们响应顶级控制器是非常复杂的。所以我使用了这种方法。
现在,您必须考虑的一件事 - 如果 BOOL 设置为 NO,则不会发生旋转 - 所以一个问题是,如果您的可旋转视图控制器在旋转时弹回其父级。然后父级将被旋转,可旋转视图控制器将旋转值设置回 no。我在我的方法中解决了这个问题,除非它处于纵向模式,否则我会阻止它关闭 - 基本上我在横向模式下禁用了“后退”按钮。
这样工作:
- 视图出现在屏幕上 - 将旋转设置为 YES
- 发生旋转
- 此时,正在旋转的视图将获得以下选择器调用:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
因此,在该调用中,您将配置本地视图并执行您需要做的任何事情来设置视图以更改方向 - 例如 self.navigationController.hidesBackButton = YES;
希望对您有所帮助,就像我说的那样,它有点像 hack,我正在寻找更优雅的东西。
祝你好运