0
votes

I have a reasonably simple split view application adapted from iPhone code. The main functionality is in shared classes with iPhone and iPad specific classes inheriting and augmenting the code. All the classes used in the iPad app have the following:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}

The main view controller consists of a UIToolbar and a UITableView. The responds to rotations correctly at every stage bar two. If I present a modal dialog from this view:


 navigationController = [[UINavigationController alloc] initWithRootViewController:tvc];
 navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
 [self presentModalViewController:navigationController animated:NO];

Everything works as expected including rotating the device until I dismiss the dialog in any way with:

 [self dismissModalViewControllerAnimated:YES];

At which point my main view rotates 90 degrees. I've looked into the settings in nib files and it all seems to be fine. Any advice? A modal dialog presented by the UITableView on the left hand side does not present this problem.

Bonus Question:

I've discovered the modal dialog presented by the left hand view does have a glitch. But only one. If it is presented by the popover view in portrait mode and the device is rotated you get a rather impressive graphical glitch as it rotates out of the view for ever!

1
A shell of a split view application I quickly knocked up doesn't display the issue so I'll compare and contrast and post back the solution when I find it.Diziet
Setting breakpoints and stepping through shows that shouldAutorotatetoInterfaceOrientation is called on every displayed view when the modal view controller is presented. That seems awfully strange when the view hasn't been rotated.Diziet
Note - Behaviour mentioned as 'Strange' above appears to be normal. Which I still think is bloody strange; why are these calls being made when the device is not being rotated? The layout of my app is that the main display window consists of a xib containing a UIView(with UIToolbar & UITableView) and a UITableViewController. This is all linked in normally via IB. I've read elsewhere that having view controllers inside view controllers is a really dumb idea so I'm going to merge the code into one. There's a historical reason it's separate but it's essentially : simplicity + laziness.Diziet

1 Answers

0
votes

As noted in the comment above I managed to merge the two view controllers into one, incorporating the code to handle the toolbar + splitview controller into the iPad version. Originally there was a common class which inherited from UITableViewController, both the iPad and iPhone versions of the code inherited from this common class. The problem was on the iPad I wanted a toolbar at the top and had to support the splitview controller too. This was problematic given that the class was a UITableViewController so I created a parent class containing the toolbar and the tableview controller plus the splitview code. In refactoring I changed the common class to a UIViewController and made the changes to support a UITableView in code, as normal and instructed in several iPhone dev books. In the iPhone version of class I manually create the UITableView with the necessary methods. In the iPad version it comes from a xib file. This schematically simplifies things as now the main view doesn't have a controller within a controller. It also solves the problem. The UI rotating 90 degrees upon closing a modal dialog no longer occurs.