Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在自动旋转期间加载新的NIB文件?_Ios_Autorotate_Glkit - Fatal编程技术网

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

Ios 如何在自动旋转期间加载新的NIB文件?,ios,autorotate,glkit,Ios,Autorotate,Glkit,苹果的笔尖本机不支持旋转,所以我尝试对同一视图使用两个不同的笔尖——每个方向一个 我尝试了以下方法,效果很好,除了。。。它打断了一些子视图(例如苹果的OpenGL/GLKit视图) 它只会打断第一次旋转-所有后续旋转都完全按照预期工作。所以,我假设苹果公司的“viewWill/Did”调用中有一个微妙之处,我在这里没有提到。问题是,我从来都找不到关于这方面的真实文档——只是在苹果文档中到处模糊地提到“一些”发生的呼叫,以及何时/为什么 -(void)willRotateToInterfaceOr

苹果的笔尖本机不支持旋转,所以我尝试对同一视图使用两个不同的笔尖——每个方向一个

我尝试了以下方法,效果很好,除了。。。它打断了一些子视图(例如苹果的OpenGL/GLKit视图)

它只会打断第一次旋转-所有后续旋转都完全按照预期工作。所以,我假设苹果公司的“viewWill/Did”调用中有一个微妙之处,我在这里没有提到。问题是,我从来都找不到关于这方面的真实文档——只是在苹果文档中到处模糊地提到“一些”发生的呼叫,以及何时/为什么

-(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];
    }

}

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

如果您希望根据 设备是纵向或横向的,这样做的方式是 使用两个单独的视图控制器

请阅读以下内容,以了解具体操作方法


希望这有帮助

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

对于李维来说,至少可以追溯到iOS 4.3,苹果的建议是“用特定于方向的笔尖加载新控制器”。在Xcode中,您可以安装旧的iOS文档集,如果您阅读iOS 4.3 View Controller编程指南,并转到“创建备用横向界面”部分,您将看到他们当时的建议与我们现在看到的非常相似(尽管它使用的是NIB而不是故事板)。但概念是一样的。如果方向不同,则启动新的视图控制器。这将是最可靠的方法,IMHO,因为当我很久以前研究这个问题时,似乎所有涉及在背景中加载笔尖的技术对他们来说都有点笨拙。对横向控制器执行此模式可确保没有关键系统通知或其他操作从裂缝中溜走


就我个人而言,我觉得这已经够麻烦的了,我通常放弃了针对不同方向的单独笔尖,而只使用一个笔尖/场景,依靠弹簧和支柱(也称为自动调整大小遮罩)来完成绝大多数布局更改。当我有一个视图,它的更改需要更显著地重新调整控件之间的位置、更改背景图像等,我将以编程方式更改
viewWillLayoutSubviews
(如果iOS版本低于5.0,我会从
WillAnimateRotationInterfaceOrientation
调用它,但对于iOS 5及更高版本,
viewWillLayoutSubviews
更为优越)。

我发现了问题:这似乎是苹果OpenGL代码中的一个bug。只有使用GLKit的项目才会受到影响:

苹果的GLKViewController必须是唯一的视图控制器,占据容器VC的整个区域(例如UINavigationController/UITabController/window的rootViewcontroller),并且必须精确管理一个GLKView-如果还有其他视图,和/或GLKViewController不是全屏的,则会中断自动旋转。(当GLKVC被连接为运行该节目的GLKVC时,苹果似乎在做一些把戏,否则不会启动)


从理论上讲,如果你创建一个定制的容器视图控制器(iOS 5的新功能,目前苹果只提供了部分文档),那么它就可以正常工作。但在苹果发布完整的文档之前(可能是明年的WWDC?)这很难做到。

感谢链接到文档-这是一个最近的更改,我以前没有发现。不幸的是,这种方法似乎需要iOS 5和大量额外代码(并且需要禁用自动旋转并使用通知)。此外,文档中缺少关于将发生什么的详细信息-它仅提供了一个示例,说明您使用特定类型的故事板时,不同的故事板会改变这些事件发生的情况:(谢谢你这么说。我后来才想起这种方法的主要问题:它在技术上是不正确的,而且从长远来看,它打破了其他开发人员可能做出的合理假设(我以前就这样做过:()。最终,它会无缘无故地删除/重新分配所有状态,这会导致基于NSNotification的代码出现很多问题。在复杂的应用程序中,它会破坏苹果的一些其他API(例如CoreData,它不需要大量工作就无法更改线程)。“苹果的NIB不支持本机旋转”-你从哪里得到的?从过去4年在Interface Builder中开发的经验来看:绝大多数界面需要轮换重新布局-仅仅“挤压一些东西,所有东西都按比例”远远不够“充分”,几乎完全没有用。适用于iPad与iPhone(勉强),但对于横向与纵向而言,情况非常糟糕……而且,令人遗憾的是,苹果的新布局系统绝对不起作用(目前)。对于iOS 6.0,它可能适用于现实世界的应用程序,但到目前为止,它发生了灾难性的破坏(无论是在编辑器中还是在运行时)在我看到的大多数示例中。嗯……我想知道:也许我可以在ViewWillLayoutSubView中加载第二个NIB,但不连接插座,并使用其“新NIB”对应的帧以编程方式“重新配置”所有内存中现有的对象?