来自XIB的UINavigationcontroller的iOS 6轮换问题

时间:2013-03-14 23:41:36

标签: ios6 uinavigationcontroller rotation

我正在尝试允许一些视图在我的应用程序中旋转(只有两个),我在成功之前完成了这项工作,继承了UINavigationcontroller并重写了相应的方法。这次的问题是我正在使用第三方项目从.xib文件创建导航控制器(不是以编程方式)。我更改了.xib文件中的类以使用我的自定义导航控制器,但是由于某种原因忽略了覆盖方法,如shouldAutorotate和supportedInterfaceOrientations

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我仍在寻找一种更优雅的方式来处理这个问题,但我会分享一些对我有用的黑客。如果你找到更好的东西,请告诉我。

在具有复杂导航树的应用程序中对我有效的方法是,如果您的应用程序中没有导航控制器,则为第一个导航控制器或第一个视图控制器安装自定义子类。那是将接收shouldAutoRotate调用的那个。

听起来你已经这样做了。

现在您需要在shouldAutoRotate部分插入自己的逻辑。我所做的是在appDelegate中使用BOOL作为存储的地方,如果视图控制器应该自动旋转。基本上它的工作原理如下:

appDelete:

@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中改变了这个,看起来要困难得多,特别是当你有复杂的导航结构时。我有一个应用程序,堆栈顶部的“幻灯片”类型控制器,一个tabbar控制器和一堆导航控制器。试图挑选所有这些以获得堆栈底部的Web视图以进行旋转,或让他们响应顶级控制器非常复杂。所以我用过这种方法。

现在,你需要考虑的一件事是 - 如果BOOL变为NO,那么就不会发生旋转 - 所以如果你的可旋转视图控制器在旋转时弹回到它的父节点就会出现问题。然后旋转父级,可旋转视图控制器将旋转值设置为否。我在解决方法中解决了这个问题,除非它处于纵向模式,否则它会被解雇 - 基本上我在横向模式下禁用了“后退”按钮。

这样的工作原理如下:    - 视图出现在屏幕上 - 将旋转设置为YES    - 发生旋转         - 此时,正在旋转的视图将获得以下选择器调用:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

因此,在该调用中,您将配置本地视图并执行任何操作以设置方向更改的视图 - 例如self.navigationController.hidesBackButton = YES;

希望有帮助,就像我说的那样,它有点像黑客,我正在寻找更优雅的东西。

祝你好运