在 iPad 上使用多个窗口处理方向
Posted
技术标签:
【中文标题】在 iPad 上使用多个窗口处理方向【英文标题】:Handling Orientation with Multiple Windows on iPad 【发布时间】:2010-10-07 03:18:07 【问题描述】:我有一个 iPad 应用程序,它在两种状态之间切换,一种使用 SplitView,另一种使用 TableView。
目前我有一个 UIWindow 对象,并使用以下代码在视图之间切换
-(void) switchToStateA
[viewControllerB.view removeFromSuperview];
[window addSubview:viewControllerA.view];
-(void) switchToStateB
[viewControllerA.view removeFromSuperview];
[window viewControllerB.view];
除非我更改设备方向,否则一切正常。在改变方向和切换状态后,在改变期间未激活的状态仍处于其旧状态的框架中(在显示边缘留下黑色区域)。如果我再次更改方向,新状态将被修复。
我试过添加
[viewControllerA.view setNeedsLayout];
交换视图后但没有效果。
如何确保后台视图控制器获得方向回调,或者如何在切换状态时调用“刷新”?
【问题讨论】:
此代码是否在您的应用委托的视图控制器中?还是完全在其他地方? 【参考方案1】:这纯粹是我的猜测,但如果不是从窗口中删除视图控制器的视图,而是将视图设置为隐藏并使用exchangeSubviewAtIndex:withSubviewAtIndex:
更改哪个视图控制器的视图对用户可见,该怎么办。我想知道操作系统是否正在优化不向任何视图没有超级视图的视图控制器发送旋转事件。
您甚至可以对动画感兴趣,将顶视图的 alpha 淡化为 0,而底部视图的 alpha 淡化为 1,然后再切换位置。
【讨论】:
谢谢,我试试看。虽然当 UIWindow 包含多个子视图时我遇到了一个严重的问题,但一切似乎都崩溃了。 一旦我使用 (addSubview:) none 将多个视图插入到 UIWindow 中,所有视图都会收到任何旋转回调,当我尝试旋转时,屏幕看起来非常有问题. 我没想到。您可能需要在窗口内创建一个“内容视图”并将视图控制器的视图放入其中。当然,现在您正在创建一个非常深的视图层次结构,这可能会影响性能或内存。【参考方案2】:设备方向更改由 UIViewControllers 处理,而不是由独立的 UIViews 处理。解决您的问题的最简单方法是使控制器的视图成为一个哑容器,您永远不会从窗口中删除它。在控制器允许的情况下,容器视图将始终正确旋转。然后,您只需在容器视图中添加/删除子视图即可使它们也旋转。在将子视图添加到容器视图之前,不要忘记设置子视图的框架和自动调整大小的掩码。
【讨论】:
我不明白为什么需要“虚拟”容器,因为 UIWindow 本身就是一个视图。 我认为你关于设置子视图框架的建议会起作用,不幸的是我不知道如何为 SplitView 做到这一点 UIWindow 只是一个视图,但它是一种非常特殊的视图。它跟踪视图添加到其中的第一个视图控制器,并向其发送设备旋转消息。它不会将这些消息直接发送到视图。这就是为什么您需要一个“根”视图控制器来获取消息。你可以用它做任何事情,包括向控制器的视图添加/删除拆分视图和表格视图,就像将它们添加到窗口一样。然而,如果你正在交换视图控制器,你可以创建一个根 UINavigationController 并发送它 -setViewControllers: 来交换它们。以上是关于在 iPad 上使用多个窗口处理方向的主要内容,如果未能解决你的问题,请参考以下文章
在多个窗口上处理视图 - 第二个窗口关闭时 removeFromSuperView 的问题