2

我正在创建一个 iPad 应用程序,它只能在纵向和纵向倒置模式下工作。由于 applicationDidFinishLaunching 方法中的性能原因,我创建了几个 viewController,并将它们作为子视图添加到我的主窗口中。然后,我将不想立即看到的隐藏起来。没有标签栏或导航控制器。

我的问题是只有第一个 viewController 似乎正在接收旋转调用。我已经通过交换将子视图添加到主窗口和 NSLog 的顺序来验证这一点。有什么方法可以强制所有控制器接听电话吗?

我的一些视图被设计为覆盖在另一个视图的顶部,但是这个后面的视图并不总是相同的——所以将覆盖视图放在一个单独的视图控制器中似乎是有意义的。我是否在做一些根本错误的事情,这就是为什么它的行为不像我预期的那样?

编辑:这个问题的公认答案似乎表明我面临的确切问题:UIViewController rotate methods

编辑2:另一个确认只有“主”视图控制器将接收旋转事件的问题。我真的需要将所有代码放入一个具有多个视图的视图控制器中吗?一次在屏幕上显示多个视图控制器?

4

4 回答 4

5

对于将来遇到此问题的人,我通过将项目移出应用程序委托并进入单个视图控制器来解决此问题。然后这个视图控制器包含所有相关的子视图控制器。通过仅将主视图控制器作为应用程序委托窗口的直接子视图,自动旋转恢复正常工作。

于 2010-06-08T00:47:17.823 回答
2

在 AppDelegate 中,您必须使用

[self.window setRootViewController:_controller];

反而

[self.window addSubview:_controller.view];

并且控制器必须覆盖方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}
于 2011-04-25T11:25:48.143 回答
1

还有另一种解决方案,具体取决于您的设计方案。我有一个类似的问题,我需要切换到覆盖视图控制器,这两个都必须支持自动旋转。

解决方案非常简单。只需将控制器放在不同的窗口对象下。

所有 UIWindow 对象都接收设备方向事件并将它们传播到它们的子视图控制器。

所以,最后我只是换了 UIWindow(s) 并且它工作得很好。

于 2010-09-12T13:13:57.820 回答
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 中放置的 Autosizing 设置重新定位。

于 2011-09-29T18:12:56.737 回答