开发者

iPad Modal view not rotating

开发者 https://www.devze.com 2023-01-14 11:15 出处:网络
So I have a modal view displaying in my app that has a little info for the user to fill out.The problem is that when the device is rotated, some animation occurs, but only in the frame.The form 开发者

So I have a modal view displaying in my app that has a little info for the user to fill out. The problem is that when the device is rotated, some animation occurs, but only in the frame. The form 开发者_运维知识库itself does not rotate. All the autorotate options are set to YES. I am displaying it when the user clicks on a field in a popover. This makes me suspect it has something to do with that but I am not sure. It is bizzare because if the device is in either view and then the modal window is displayed, it is fine. It only happens when the device is rotated in the modal view. Does anyone have any idea what may be causing this behavior when the device is rotated? Thanks!

Here is a snippet that is handled in the popover view controller:

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


I ran into this problem as well. The fundamental problem is that popover controllers cannot present modal views—it seems that case wasn’t properly considered or designed for. In my situation, it was easy enough to work around. I just extended the delegate protocol for my popover-hosted view controller. The main view sets itself up as the delegate to the popover view, and takes responsibility for displaying and dismissing the modal views the user requests from within the popover.

Since I already had a delegate protocol to cleanly dismiss the popover view when the user clicks “done” it was only a small stretch to get autorotation working the way I wanted it to. Here are some snippets:

@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

And in my main iPad view which presents this popup view:

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

To make life simple for cases where I am launching the info view outside of a popup view (for example, on the iPhone, it is a simple modal view), it checks to see if the delegate handles the modal subviews, and if not, handles them itself. That way I didn’t need to change the iPhone base controller at all, since autorotation already worked fine there. Here’s the “Help” button action in the info view controller, showing how I did that:

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

With this code in place, my entire interface autorotates smoothly on both devices, whether or not popup views were involved.


Just so i understand correctly... You are displaying a popover and inside that popover if the user taps a certain element then you are displaying a full screen modal view controller? Vie never tried that before and it seems odd for two reasons.

First it seems jarring to the user in my opinion. The popover gives you a nice, integrated UI and the modal takes you away.

More importantly though, your popover view controller doesn't really have authority over the whole screen so presenting a full screen modal from a popover just seems inherently wrong.

I would suggest you display a nav controller in the popover controller and instead of presenting the new view controller modally over the whole screen just push it on to the nav controller in the popover and keep the user inside the popover.

If that doesn't really work for you, then I would suggest reviewing your UI needs and redesigning the layout.


I am guessing that you implemented - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation in BusinessFilteredViewController and returns YES

Could you check that you add more than 1 subviews to application window . If so, try to create container UIViewController for all viewControllers that you want to add to window.

0

精彩评论

暂无评论...
验证码 换一张
取 消