【问题标题】:iPad Modal view not rotatingiPad 模态视图不旋转
【发布时间】:2024-01-06 06:27:01
【问题描述】:

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

这是一个在弹出视图控制器中处理的 sn-p:

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];
}

【问题讨论】:

  • 您能否发布更多代码,尤其是您的 BusinessFilteredViewController 中的一些代码?就像你在这两个控制器的 willRotateToInterfaceOrientation:duration 函数中做了什么特别的事情?
  • 我没有,这是默认选项。我需要做一些特别的事情吗?

标签: iphone objective-c ipad ios4


【解决方案1】:

所以我理解正确...如果用户点击某个元素,您正在显示一个弹出框并在该弹出框内,那么您正在显示一个全屏模式视图控制器? Vie 以前从未尝试过,这看起来很奇怪,原因有两个。

首先,在我看来,这对用户来说似乎很刺耳。弹出框为您提供了一个不错的集成 UI,而模态框则让您远离。

更重要的是,您的弹出视图控制器实际上并没有对整个屏幕的权限,因此从弹出窗口呈现全屏模式似乎本质上是错误的。

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

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

【讨论】:

    【解决方案2】:

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

    您能否检查您是否向应用程序窗口添加了超过 1 个子视图。如果是这样,请尝试为要添加到窗口的所有视图控制器创建容器 UIViewController

    【讨论】:

      【解决方案3】:

      我也遇到了这个问题。根本问题是弹出框控制器不能呈现模态视图——似乎没有适当考虑或设计这种情况。在我的情况下,解决这个问题很容易。我刚刚为我的 popover 托管的视图控制器扩展了委托协议。主视图将自己设置为弹出框视图的代理,并负责显示和关闭用户从弹出框中请求的模式视图。

      由于我已经有了一个委托协议,可以在用户单击“完成”时干净地关闭弹出视图,因此只需一小段时间就可以让自动旋转按照我想要的方式工作。以下是一些sn-ps:

      @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];
          }
      }
      

      有了这段代码,我的整个界面在两个设备上都能顺利自动旋转,无论是否涉及弹出视图。

      【讨论】:

      • 是的,您似乎无法通过弹出框控制器进行演示。我出于内部目的需要它,并且不打算发布该设计。通过使用弹出框控制器的“父级”,它可以正常工作。