代码之家  ›  专栏  ›  技术社区  ›  gabaum10

iPad模式视图不旋转

  •  2
  • gabaum10  · 技术社区  · 14 年前

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

    以下是在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 回复  |  直到 13 年前
        1
  •  5
  •   James Elliott    13 年前

    我也遇到了这个问题。根本问题是,Popover控制器不能显示模态视图,似乎情况没有被正确考虑或设计。在我的情况下,工作很容易。我刚刚扩展了我的Popover托管视图控制器的委托协议。主视图将自己设置为Popover视图的委托,并负责显示和取消用户在Popover中请求的模式视图。

    因为我已经有了一个委托协议,当用户单击__done_157;时,它可以清晰地忽略弹出窗口视图,所以它只是一个很小的扩展,可以让自动旋转按照我想要的方式工作。以下是一些片段:

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

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

        2
  •  0
  •   Kenny Wyland    13 年前

    只是为了让我正确理解…您正在显示一个弹出窗口,在该弹出窗口中,如果用户点击某个元素,那么您正在显示一个全屏模式视图控制器?VIE以前从未尝试过,这看起来很奇怪,原因有两个。

    首先,在我看来,这似乎让用户感到不安。Popover为您提供了一个很好的集成用户界面,而Modal则会将您带走。

    更重要的是,你的Popover视图控制器并不能真正控制整个屏幕,所以从一个Popover显示一个全屏模式似乎是固有的错误。

    我建议您在Popover控制器中显示一个导航控制器,而不是在整个屏幕上显示新的视图控制器,只需将其推到Popover中的导航控制器上,并将用户保持在Popover中即可。

    如果这真的不适合您,那么我建议您检查您的UI需求并重新设计布局。

        3
  •  0
  •   Alkimake    13 年前

    我猜你已经实施了 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 在里面 BusinessFilteredViewController 回报 YES

    你能检查一下你是否在应用程序窗口中添加了1个以上的子视图吗?如果是,请尝试创建容器 UIViewController 对于要添加到窗口中的所有视图控制器。