32
votes

I would like obtain a SplitView on my iPad application with my left menu in a portrait orientation such as iPad settings. For now in portrait orientation I have a content view in full screen and I have a button at NavigationBar which includes a popover with my left menu.

8

8 Answers

50
votes

This is the magic you need:

This method is in UISplitViewControllerDelegate, available on iOS 5.0

- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
{
    return NO;
}
11
votes

You should definitely have a look at Matt Gemmell's MGSplitViewController.

MGSplitViewController is an open source replacement for UISplitViewController, with various useful enhancements.

9
votes

Unfortunately, it's an undocumented method (i.e. private API).

[splitViewController setHidesMasterViewInPortrait:NO];

I think you need to create a custom view controller containing a table view (as the master controller) and another generic subview (as the detail controller) to simulate this.

8
votes

The easiest way to get the effect you want may be to just not use a UISplitView. Instead, just create a normal view, put a table view on its left side, your detail view on the right side, and then set the autosizing stuff appropriately so that everything looks right in both portrait and landscape.

6
votes

As ccwasden stated, shouldHideViewController is deprecated as of iOS8. In Objective-C, use...

splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
5
votes

Since shouldHideViewController is deprecated in iOS8, you will need to use this instead (Swift):

splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
4
votes

some people asked me the same question on our blog and I found a solution for that. You will find it at the end of my blog post Your first split view controller | Seaside.

In general, all you have to do is to create a subclass of UISplitViewController and override the method willAnimateRotationToInterfaceOrientation: duration: and adjust your master and detail views when the interface orientation will change to portrait mode.

Cheers, Andreas

3
votes

In Swift:

splitViewController.preferredDisplayMode = .allVisible