Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Cocoa touch 在iPad上使用多个窗口处理方向_Cocoa Touch_Ipad_Ios_Interface Orientation - Fatal编程技术网

Cocoa touch 在iPad上使用多个窗口处理方向

Cocoa touch 在iPad上使用多个窗口处理方向,cocoa-touch,ipad,ios,interface-orientation,Cocoa Touch,Ipad,Ios,Interface Orientation,我有一个iPad应用程序,它在两个状态之间运行,一个使用SplitView,另一个使用TableView 目前,我有一个UIWindow对象,并使用以下代码在视图之间切换 -(void) switchToStateA { [viewControllerB.view removeFromSuperview]; [window addSubview:viewControllerA.view]; } -(void) switchToStateB { [viewControllerA.view remo

我有一个iPad应用程序,它在两个状态之间运行,一个使用SplitView,另一个使用TableView

目前,我有一个UIWindow对象,并使用以下代码在视图之间切换

-(void) switchToStateA {
[viewControllerB.view removeFromSuperview];
[window addSubview:viewControllerA.view];
}
-(void) switchToStateB {
[viewControllerA.view removeFromSuperview];
[window viewControllerB.view];
}
除非我改变设备方向,否则一切正常。在改变方向和开关状态后,在改变过程中未激活的状态仍处于其旧状态的框架中(在显示器边缘留下黑色区域)。如果我再次更改方向,新状态将被修复

我试着加上

[viewControllerA.view setNeedsLayout];
交换视图后,但没有效果


如何确保背景视图控制器获得方向回调,或者如何在切换状态时调用“刷新”?

这纯粹是我的猜测,但如果不是从窗口中删除视图控制器的视图,将视图设置为“隐藏”,并使用以更改用户可见的视图控制器的视图。我想知道操作系统是否在优化不向任何视图没有超级视图的视图控制器发送旋转事件


您甚至可以对动画产生兴趣,在切换位置之前,将俯视图的alpha淡入0,而将俯视图的alpha淡入1。

设备方向的更改由UIViewController处理,而不是由孤立的UIView处理。解决问题的最简单方法是使控制器的视图成为一个哑容器,您永远不会从窗口中删除它。在控制器允许的情况下,容器视图将始终正确旋转。然后,只需在容器视图中添加/删除子视图,即可使其旋转。在将子视图添加到容器视图之前,不要忘记设置子视图的帧和自动调整遮罩大小

谢谢,我试试看。虽然当UIWindow包含多个子视图时,我遇到了一个严重的问题,但一切似乎都崩溃了。当我使用(addSubview:)将多个视图插入UIWindow时,没有一个视图收到任何旋转回调,当我尝试旋转时,屏幕看起来很糟糕。我没有想到这一点。您可能需要在窗口内创建“内容视图”,并将视图控制器的视图放入其中。当然,现在您正在创建一个相当深的视图层次结构,这可能会影响性能或内存。这段代码是您的应用程序委托的视图控制器的一部分吗?或者完全在其他地方?我不明白为什么需要“虚拟”容器,因为UIWindow本身就是一个视图。我认为您关于设置子视图框架的建议会起作用,不幸的是,我不知道如何为SplitViewUIWindow做这件事,因为它只是一个视图,但是一种非常特殊的视图。它跟踪其视图已添加到的第一个视图控制器,并向其发送设备旋转消息。它不会将这些消息直接发送到视图。这就是为什么需要一个“根”视图控制器来获取消息。您可以使用它执行任何操作,包括将拆分视图和表视图添加/删除到控制器的视图,就像将它们添加到窗口一样。但是,如果要交换视图控制器,则可以创建根UINavigationController并发送-setViewController:以交换它们。