iPad模态视图不旋转

时间:2010-09-02 15:33:35

标签: iphone objective-c ipad ios4

所以我在我的应用程序中显示了一个模态视图,其中包含一些用户填写的信息。问题是当旋转设备时,会发生一些动画,但仅在帧中。表单本身不会旋转。所有自动旋转选项都设置为YES。当用户点击弹出窗口中的字段时,我正在显示它。这让我怀疑它与此有关,但我不确定。这是古怪的,因为如果设备在任一视图中,然后显示模态窗口,它是好的。只有在模态视图中旋转设备时才会发生这种情况。有没有人知道在旋转设备时可能导致此行为的原因是什么?谢谢!

这是在popover视图控制器中处理的片段:

if (currentLevel == 1 && businessOrLocation == 0){
    if(tbsViewController == nil)
        tbsViewController = [[BusinessFilteredViewController alloc] initWithNibName:@"BusinessFilteredView" bundle:[NSBundle mainBundle]];

    NSMutableArray *tempBusiness = [[NSMutableArray alloc] init];
    for (id theKey in appDelegate.groupedBusiness) {
        NSMutableArray *tempArr = [appDelegate.groupedBusiness objectForKey:theKey];
        [tempBusiness addObject:tempArr];
    }

    tbsViewController.businessOrLocation = businessOrLocation;
    tbsViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    tbsViewController.modalTransitionStyle = UIModalPresentationFullScreen;
    [self presentModalViewController:tbsViewController animated:YES];
}

3 个答案:

答案 0 :(得分:5)

我也遇到了这个问题。根本问题是,popover控制器无法呈现模态视图 - 似乎没有正确考虑或设计案例。在我的情况下,解决这个问题很容易。我只是扩展了我的popover托管视图控制器的委托协议。主视图将自身设置为弹出视图的委托,并负责显示和解除用户在弹出框中请求的模态视图。

由于我已经有一个委托协议,当用户点击“完成”时干净地忽略弹出窗口视图,因此只需要一小段时间就可以按照我想要的方式进行自动旋转。以下是一些片段:

@protocol InfoViewControllerDelegate <NSObject>

@optional

// Implement this to close the info view once the user clicks done.
- (void)infoViewDidFinish:(InfoViewController *)view;

// Implement this method if the delegate launched us as a popup view and must therefore
// take responsibility for diplaying help.
- (void)infoViewDidRequestHelp:(InfoViewController *)view;

@end

在我的主iPad视图中显示了这个弹出视图:

#pragma mark - InfoViewControllerDelegate methods

- (void)infoViewDidFinish:(InfoViewController *)view {
    [self hideInfo:self];
}

- (void)infoViewDidRequestHelp:(InfoViewController *)view {
    [self hideInfo:self];  // Close the info view first
    HelpViewController *help = [[HelpViewController alloc] init];
    help.delegate = self;
    [self presentModalViewController:help animated:YES];
    [help release];
}

为了让我在弹出视图之外启动信息视图的情况下简单生活(例如,在iPhone上,这是一个简单的模态视图),它会检查委托是否处理模态子视图,以及如果没有,自己处理它们。这样我根本不需要更换iPhone底座控制器,因为自动旋转在那里工作得很好。这是信息视图控制器中的“帮助”按钮操作,显示了我是如何做到的:

- (IBAction)help:(id)sender {
    if ([delegate respondsToSelector:@selector(infoViewDidRequestHelp:)]) {
        [delegate infoViewDidRequestHelp:self];
    } else {
        HelpViewController *help = [[HelpViewController alloc] init];
        help.delegate = self;
        [self presentModalViewController:help animated:YES];
        [help release];
    }
}

使用此代码,无论是否涉及弹出视图,我的整个界面都会在两台设备上平滑自动旋转。

答案 1 :(得分:0)

正如我所理解的那样......如果用户点击某个元素,那么你正在显示一个popover并在popover内部然后你正在显示一个全屏模态视图控制器? Vie之前从未尝试过,有两个原因似乎很奇怪。

首先,在我看来,这对用户来说似乎很不利。 popover为您提供了一个漂亮的集成UI,模式将带您离开。

更重要的是,你的popover视图控制器并没有真正拥有整个屏幕的权限,所以从一个popover呈现全屏模式似乎本身就是错误的。

我建议您在弹出控制器中显示一个导航控制器,而不是在整个屏幕上以模态方式显示新的视图控制器,只需将其推送到弹出窗口中的导航控制器,并将用户保留在弹出框内。

如果这对您不起作用,那么我建议您查看您的UI需求并重新设计布局。

答案 2 :(得分:0)

我猜您在- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation中实施了BusinessFilteredViewController并返回YES

您可以检查是否向应用程序窗口添加了多个子视图。如果是这样,请尝试为要添加到窗口的所有viewControllers创建容器UIViewController