2

Apple 的 NIB 本身不支持旋转,所以我尝试为同一个视图使用两个不同的 NIB - 每个方向一个。

我尝试了以下,它的工作原理,除了......它打破了一些子视图(例如苹果的 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];
    }

}
4

3 回答 3

2

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

如果您想根据设备是纵向还是横向显示相同的数据,方法是使用两个单独的视图控制器。

阅读View Controller Programming Guide以了解具体情况。

希望这可以帮助!

于 2012-12-16T17:08:37.383 回答
0

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

对于 Levi 的观点,至少早在 iOS 4.3 中,Apple 的建议一直是“加载具有特定方向的 NIB 的新控制器”。在 Xcode 中,您可以安装旧的 iOS 文档集,如果您查看 iOS 4.3 View Controller Programming Guide,并转到“创建备用景观界面”部分,您会看到他们当时的建议与我们现在看到的非常相似(尽管它使用的是 NIB 而不是故事板)。但概念是一样的。如果方向不同,则启动一个新的视图控制器。这将是最强大的方法,恕我直言,当我很久以前研究这个时,似乎所有涉及在后台加载 NIB 的技术对他们来说似乎有点笨拙。对景观控制器执行此模式可确保关键系统通知或其他操作不会漏掉。

就我个人而言,我发现这已经够麻烦了,我通常已经放弃了针对不同方向的单独 NIB,而是使用单个 NIB/场景,并依靠弹簧和支柱(也称为自动调整大小的蒙版)来完成绝大多数布局更改. 当我有一个视图,其更改需要更重要的控件相互重新定位、更改背景图像等时,我将以编程方式更改布局viewWillLayoutSubviews(如果 iOS 版本低于 5.0,我从willAnimateRotationToInterfaceOrientation...但对于 iOS 5 及更高版本,viewWillLayoutSubviews更胜一筹)。

于 2012-12-16T20:58:13.003 回答
0

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

Apple 的 GLKViewController 必须是唯一的视图控制器,占据 Container VC 的全部区域(例如 UINavigationController/UITabController/window 的 rootViewcontroller),并且必须精确管理一个 GLKView - 如果还有其他的,和/或 GLKViewController 未满屏幕,它打破了自转。(当 GLKVC 被连接为运行节目的人时,Apple 似乎正在做一些技巧,否则不会触发)

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

于 2012-12-29T18:17:59.603 回答