0

我试图让一些视图在我的应用程序中旋转(只有两个),我之前已经成功地做到了这一点,继承 UINavigationcontroller 并覆盖相应的方法。这次的问题是我正在使用第三方项目,该项目从 .xib 文件(不是以编程方式)创建导航控制器。我更改了 .xib 文件中的类以使用我的自定义导航控制器,它确实如此,但由于某种原因忽略了像 shouldAutorotate 和supportedInterfaceOrientations 这样的覆盖方法

有任何想法吗?

谢谢

4

1 回答 1

0

我仍在寻找一种更优雅的方式来处理这个问题,但我将分享一个对我有用的小技巧。如果你发现更好的东西,请告诉我。

在具有复杂导航树的应用程序中,一种对我来说效果不错的方法是,如果您的应用程序中没有导航控制器,则为第一个导航控制器或第一个视图控制器安装自定义子类。那就是将接收 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;

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

祝你好运

于 2013-03-15T00:31:50.460 回答