如何在自动旋转期间加载新的NIB文件?

时间:2012-12-16 16:23:04

标签: ios autorotate glkit

Apple的NIB本身不支持轮换,因此我尝试在同一视图中使用两个不同的NIB - 每个方向一个。

我尝试了以下内容,但它确实有效,除了......它打破了一些子视图(例如Apple的OpenGL / GLKit视图)。

它只会打破第一次旋转 - 所有后续旋转都完全按预期工作。所以,我假设苹果公司的“viewWill / Did”电话中有一个微妙之处,我在这里缺少这些电话。问题是,我从来没有能够找到真正的文档 - 只是在Apple文档中的模糊引用,以及“某些”发生的调用,以及何时/为什么。

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if( UIInterfaceOrientationIsLandscape( toInterfaceOrientation) )
    {
        [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])] owner:self options:nil];

        [self viewDidAppear:FALSE];
        [self viewWillDisappear:FALSE];
        [self viewDidReload];
        [self viewWillAppear:FALSE];
        [self viewDidAppear:FALSE];

        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-landscape"] forBarMetrics:UIBarMetricsDefault];
    }
    else
    {
        [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", NSStringFromClass([self class])] owner:self options:nil];

        [self viewDidAppear:FALSE];
        [self viewWillDisappear:FALSE];
        [self viewDidReload];
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-portrait"] forBarMetrics:UIBarMetricsDefault];
        [self viewWillAppear:FALSE];
        [self viewDidAppear:FALSE];
    }

}

3 个答案:

答案 0 :(得分:2)

根据Apple的说法,在您的情况下,您不仅应该加载不同的笔尖,还要更改视图控制器:

  

如果您想根据a是否以不同方式呈现相同的数据   设备处于纵向或横向方向,这样做的方法是   使用两个独立的视图控制器。

阅读View Controller Programming Guide以了解具体内容。

希望这有帮助!

答案 1 :(得分:0)

如果您搜索Stack Overflow“[ios]旋转不同的笔尖”,您将获得大量的点击量。我们可以说,有一些“创造性”的解决方案。

至于Levi的观点,至少在iOS 4.3之前,Apple的顾问一直在“使用定向特定的NIB加载一个新的控制器”。在Xcode中,您可以安装旧的iOS文档集,如果您查看iOS 4.3 View Controller编程指南并转到“创建备用横向界面”部分,您将看到他们的当时的律师与我们现在看到的非常相似(虽然它使用的是NIB,而不是故事板)。但这个概念是一样的。如果方向不同,则启动新的视图控制器。这将是最强大的方法,恕我直言,就像我很久以前研究过这一点一样,似乎所有涉及在背景中加载NIB的技术似乎对他们有些愚蠢的感觉。对景观控制器执行此模式可确保不会发生任何关键系统通知或其他操作。

就个人而言,我发现足够的麻烦,我通常放弃了不同方向的单独NIB并保持单个NIB /场景并依靠弹簧和支柱(也就是自动调整大小的掩模)来做绝大多数布局的变化。当我有一个视图,其中的更改需要相对于彼此更多重要的控件重定位,更改背景图像等,我将以编程方式更改viewWillLayoutSubviews中的布局(如果iOS版本小于5.0,我从willAnimateRotationToInterfaceOrientation调用...但是对于iOS 5及更高版本,viewWillLayoutSubviews是优越的。)

答案 2 :(得分:0)

我发现了问题:这似乎是Apple的OpenGL代码中的一个错误。它只是使用受影响的GLKit的项目:

Apple的GLKViewController必须是唯一的视图控制器,占据Container VC的整个区域(例如UINavigationController / UITabController / window的rootViewcontroller),并且必须正好管理一个GLKView - 如果还有其他的,和/或GLKViewController不是全屏,它打破了自转。 (当GLKVC被连接为运行该节目的那个时,苹果正在做一些伎俩,否则不会开火)

理论上,如果您创建一个自定义容器视图控制器(iOS 5中的新功能,目前仅部分由Apple记录),那么它将正常工作。但是,直到Apple发布完整的文档(明年可能是WWDC?),这很难做到。