【问题标题】:iOS 6 rotation issues with UINavigationcontroller from a XIB来自 XIB 的 UINavigationcontroller 的 iOS 6 旋转问题
【发布时间】:2013-03-14 23:41:36
【问题描述】:

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

有什么想法吗?

谢谢

【问题讨论】:

    标签: ios6 uinavigationcontroller rotation


    【解决方案1】:

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

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

    祝你好运

    【讨论】:

    • 感谢您的回答,非常完整。但是,我面临的问题是我的自定义类的 shouldAutorotate 方法永远不会被调用。在我的可旋转视图控制器中,我打印导航控制器的值(到控制台),以了解是否正在使用我的自定义类并且似乎是正确的。但是由于某种原因(我认为与来自 .xib 文件的导航控制器有关)我的自定义类中的覆盖方法没有被调用。问题实际上是我在目标配置中打开了所有方向,但想避免在某些视图中旋转
    • 请忽略我之前的评论。我的自定义类中的方法运行良好,问题是第三方 VC 添加了我的导航控制器,如下所示:[self.view addSubview:[customNavController view]],因为这篇文章我得到了这个想法:stackoverflow.com/questions/12775265/…。所以,我想在一些视图控制器中改变第一个 VC 的自动旋转行为。我使用您的代码覆盖了第三方 VC(而不是自定义 navController),并且工作起来非常有魅力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多