I'm using the iOS SDK 8.1.
In landscape mode, is it possible to make the master view animate left to hide and then animate right to display again? I don't want it to overlap the detail view like in portrait mode.
Would I have to create my own custom split view controller for that functionality?
No, it is not possible to hide/unhide master in landscape mode.
There are many opensource libraries for creating custom splitView controller available.
This is one good library : https://github.com/mutualmobile/MMDrawerController
Related
QUESTIONS AT THE END OF THE POST
PROBLEM: I discovered a strange behavior of UISplitViewController when embedding it in a UITabBarController. The setup is quiet simple and can be reproduced without any coding. Create a StoryBoard based app and drag a UITabBarController onto the StoryBoard and make it the initial view controller. Then drag a UISplitViewController onto the board and make it an item of the UITabBarController. Embed the UISplitViewControllers detail view controller in a UINavigationController as well. Finally, set the background color of the master and detail view controllers to something noticeable.
The StoryBoard should look like this:
Step 1: Run the application on an device which can show master and detail at the same time (e. g. iPad or big screen iPhone). You should notice that the master is not extending under the bars and instead, the background of UISplitViewController shines through.
Step 2: Rotate the screen to portrait so the master gets collapsed. Swipe in from the side to reveal the master. At this point, both navigation bars are showing the correct background color.
Step 3: Rotate the screen back to landscape. Now the detail has the background of the UISplitViewController and the master is showing the correct color.
FINDINGS:
On start, the tableview of the master is not extending under the navigation bar.
When and only if revealing the master in portrait mode and then rotating back, the glich changes so that now the master extends under the bars and the detail does not anymore.
If not revealing the master in portrait, you can rotate as many times as you want without changing the behavior
It only happens on devices which can show master and detail at the same time
It only happens when embedding a UISplitViewController in a UITabBarController
QUESTIONS:
Why are master and detail not expanding correctly under their navigation bar?
Why does this only happen on iPad/iPhone Plus and not on regular iPhones (there everything works exactly as expected)?
Is there any fix I could apply to make this work on iPad?
Is there a better design approach than having a TabBar with a master-detail flow embedded? For me a TabBar just seems right to switch between different types of content in my app and I don't want to have a full width tableview on iPads. The SplitViewController also seems to be the right approach to display my content...
5 Month later there is still no solution for this. Moreover, as I was stumbling across this issue once again while developing another app, I found this old post from 2015 having the same issue: Navigation bar for split view controller is darker when inside a tab bar controller
So I guess Apple has no intention on fixing their own controllers and we developers are screwed. The only way we can have a UITabBar at the bottom while showing a UISplitViewController above with proper translucent UINavigationBars is to implement our own container view controllers.
I finally solved the issue by using a plain UIViewController with a UITabBar pinned to the bottom while using the UIViewController containment API to show/hide my UISplitViewControllers.
I have an iOS 10 universal app (supports both iPad and iPhone). In the application .plist I have specified that the app supports both portrait and landscape mode. Now I would like to restrict a single UIViewController to portrait only mode. That view controller is presented by the same navigation controller that presents other view controllers. What is the best (easiest) way to restrict a single, specific view controller to portrait in iOS 10. (Note that there are lots of published solutions, but as far as I can tell the answer to this problem is is different for different versions of iOS. I only need a solution that supports iOS 10.)
Now I would like to restrict a single UIViewController to portrait only mode. That view controller is presented by the same navigation controller that presents other view controllers
In iOS 10, there is no supported way to do what you're describing. A navigation controller cannot have some of its children in one orientation and other children in another.
The only supported way to have a view controller force a different orientation is to make it a presented view controller (modal), not a pushed view controller in a navigation controller stack.
I've studied examples of split view (like this one) and it works great. I just need one change of behavior. I would like to have both master and detail controller visible when user have iPad in portrait. It should work just like FB Messenger or Skype. Both controllers side-by-side and without able to hide master controller. How is it possible to do that? Thanks for help
Bonus question: Is it possible to somehow set behavior for iPad portrait be same like iPhone portrait? If I would change my mind and I would like to have detail in fullscreen and after tap on left navigation bar button I would have master view in fullscreen and without detail visible. Is i possible or split view decides that and there is not much what I can do about it?
A UISplitViewController has a property called preferredDisplayMode. You can set this to any one of these values:
UISplitViewControllerDisplayModeAutomatic
UISplitViewControllerDisplayModePrimaryHidden
UISplitViewControllerDisplayModePrimaryOverlay
UISplitViewControllerDisplayModeAllVisible
You are looking for UISplitViewControllerDisplayModeAllVisible.
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAllVisible];
UISplitViewControllerDisplayModeAllVisible
The primary and secondary view controllers are displayed side-by-side onscreen.
Available in iOS 8.0 and later.
You can read more about the display modes here on Apple's documentation.
I want to implement the type of functionality as seen in the image below. I do not know if this is a UISplitViewController that has its trait collection overridden to display side-by-side in portrait orientation or if this is two UITableViewControllers using a custom animation object. Is it possible to achieve this with a UISplitViewController or is this simply using an animation object? Side-by-side or the primary (master) view controller overlaying the secondary (detail) view controller is something I am also interested in.
Is this what you're looking for? SplitView like Facebook app on iPhone
I'm using SWRevealViewController and it's great.
Github,
Tutorial
I'm working on an iPad app with the UISplitViewController. I've managed to add a button on the detail view navigation bar to 'maximise' the detail pane in landscape mode by hiding the master view (like Dropbox does). I did this by setting the split view controller delegate to nil and then back to it's delegate in order to force 'shouldHideViewController' to fire. This works but there's no transition - it just flicks to full screen. I'd like the view to stretch across the screen in a transition (as Dropbox does).
Can anybody suggest a way to achieve this?