我的应用程序有一个欢迎屏幕,只能以纵向模式显示。在用户点击欢迎屏幕后,我想显示另一个可以在纵向模式和横向模式下使用的屏幕。
我已经设置了一个视图控制器,只为shouldAutorotateToInterfaceOrientation:
实现了YES
返回UIInterfaceOrientationPortrait
,我将视图添加到[window addSubView:view]
窗口。我使用标记1
标记此视图。
当用户点击欢迎视图并且应用移动到新视图时,我会这样做:
[[window viewWithTag:1] removeFromSuperView];
[window addSubView:myViewController.view];
其中myViewController是第二个视图的视图控制器的实例(正确处理shouldAutorotateToInterfceOrientation
方法)。
现在当我旋转时,它仍然在原始视图的视图控制器上调用shouldAutorotateToInterfceOrientation
,并且不会在新视图的视图控制器上调用它。
This note from Apple表示只有一个视图控制器会获得轮换通知;但是,我已经删除了其他视图控制器。
我做错了什么?
答案 0 :(得分:1)
实际上,该说明没有说“只有一个视图控制器会收到通知”,而是说“只有添加到UIWindow的第一个视图控制器才会旋转。”。 所以这可能就是问题所在。
要解决此问题,我会说要始终在窗口中添加一个视图(称之为永久视图),并将欢迎屏幕和下一个视图添加到此永久视图中。
希望这有帮助。
答案 1 :(得分:1)
作为您链接到州的注释:
仅添加了第一个视图控制器 到UIWindow将旋转。
所以放一个标志,确保 shouldAutorotateToInterfceOrientation 返回NO,直到用户解除屏幕 - 然后返回YES。这是一个简单而有效的解决方案 - 但是,从代码可读性的角度来看,“被解雇的”视图实际上控制了旋转可能会让人感到困惑。
个人;我的经验是,让一些观点轮换而不是一些观点并不值得 - 而且用户往往不喜欢它。
快乐编码
答案 2 :(得分:1)
我写了一个快速测试,显示你想要做的事应该起作用。以下是我做的基础知识:
创建两个视图控制器。应用程序从AppDelegate中设置的第一个视图控制器开始,通过NIB文件进入实例变量viewController。然后在您编写时将其添加到窗口中。
然后我设置了一个动作,当被调用时(可能是一个Timer,第一个视图控制器上的按钮等)执行以下操作:
使用[self.viewController removeFromSuperview]删除视图。这与您使用标记的方式不同。
创建第二个视图控制器并将其分配给self.viewController。
添加到您指定的窗口。
不确定您的代码有什么不对。我猜想第一个视图可能并没有被删除。