In adopting the new UISplitViewController
I'm trying to make a change a default behaviour that occurs when using the UISplitViewControllerDisplayModeAutomatic
mode.
When working in portrait I want the primary overlay to hide when the user triggers a push to the detail side. By default the overlay remains onscreen until the user taps over on the detail side.
I've tried using the following with the delegate:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController showDetailViewController:(UIViewController *)vc sender:(id)sender
{
if (splitViewController.displayMode == UISplitViewControllerDisplayModePrimaryOverlay) {
[UIView animateWithDuration:0.3 animations:^{
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden;
}];
}
return NO;
}
This gives me the desired behavior in portrait, but this breaks landscape mode (which I want to behave like UISplitViewControllerDisplayModeAllVisible
). If you've done a push and then rotate the device the left side is still hidden (as expected). I can't find an appriprite place to hook in to re-set the prefered mode on rotation to show the left side (since trait collections can't be used to tell landscape vs portrait on the iPad).
How can I manually trigger a dismissal of the overlay?
Dupe note: iOS8 has changed UISplitViewController
entirely, so all other SO answers before June '14 are probably wrong (and I've dug through many of them, just incase)
Easily achieved using the split-view delegate as follows:
In addition to the advice from LaborEtArs to do your animation in
prepareForSegue:sender:
ortableView:didSelectRowAtIndexPath:
, if your app normally hassplitViewController:preferredDisplayMode
set toUISplitViewControllerDisplayModeAutomatic
, simply use theanimateWithDuration:
method with a completion handler to restore the displayMode after the animation:Here is the Swift version:
Placed in the prepareForSegue
Just place your code (without the
return NO;
) in the master view controllersprepareForSegue:sender:
ortableView:didSelectRowAtIndexPath:
method. There it works perfectly!I was having the same problem as you. I am doing this on Xamarin's mono touch platform, but I would think the result would be the same.
Like what LaborEtArs said, move your code to the
prepareForSegue:sender:
method of the master view controller. Then just set the mode to automatic after you set it to hidden:After doing it this way, it's no longer breaking landscape mode.