我正在创建一个iPad应用程序,它只能用于纵向和肖像倒置模式。出于性能原因,在我的applicationDidFinishLaunching方法中,我创建了几个viewControllers,并将它们作为子视图添加到我的主窗口中。然后我隐藏了那些我不想马上看到的东西。没有标签栏或导航控制器。
我的问题是只有第一个viewController似乎正在接收旋转调用。我已经通过交换我将子视图添加到主窗口和NSLog的顺序来验证这一点。有什么办法可以强迫所有控制器接听电话吗?
我的一些视图被设计为覆盖另一个视图的顶部,但是后面的视图并不总是相同的 - 所以将覆盖视图放在单独的视图控制器中似乎是有意义的。我做了一些根本错误的事情,这就是为什么它没有像我期望的那样表现?
编辑:这个问题的接受答案似乎表明了我面临的确切问题:UIViewController rotate methods
编辑2:另一个仅确认“主”视图控制器的问题将收到旋转事件。是否真的需要将我的所有代码放入一个具有多个视图的视图控制器中? Multiple view controllers on screen at once?
答案 0 :(得分:5)
对于将来遇到这种情况的人,我通过将项目移出应用程序委托并进入单个视图控制器来解决此问题。然后,该视图控制器包含所有相关的子视图控制器。通过仅将主视图控制器作为应用程序委托窗口的直接子视图,自动旋转恢复到按预期工作。
答案 1 :(得分:2)
在AppDelegate中,您必须使用
[self.window setRootViewController:_controller];
而不是
[self.window addSubview:_controller.view];
控制器必须覆盖方法
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
答案 2 :(得分:1)
根据您的设计方案,还有另一种解决方案。 我有一个类似的问题,我需要交换覆盖视图控制器,这两个视图控制器都必须支持自动旋转。
解决方案非常简单。只需将控制器放在不同的窗口对象下即可。
所有UIWindow对象都接收设备方向事件并将它们传播到子视图控制器。
所以,最后我刚刚交换了UIWindow,它运行得很好。
答案 3 :(得分:0)
我跑进这个页面寻找解决iPad应用程序这个问题的方法,我只是想分享我为解决这个问题所做的工作。
我将以下代码放在MainViewController(这是我的rootController)中:
-(void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration {
switch (toInterfaceOrientation) {
case UIInterfaceOrientationLandscapeLeft:
case UIInterfaceOrientationLandscapeRight:
// My app has a toolbar, use CGRectMake(0, 0, 1024.0, 768.0) if your's doesn't
self.view.frame = CGRectMake(0, 20, 1024.0, 748.0);
break;
case UIInterfaceOrientationPortrait:
case UIInterfaceOrientationPortraitUpsideDown:
self.view.frame = CGRectMake(0, 20, 768.0, 1004.0);
break;
default:
break;
}
}
执行此操作后,我按照我在Interface Builder中设置的自动调整大小设置重新定位了我的组件。