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?
Related
I would like to pop a view from the navigation stack (login screen) and immediately push another view (home screen) with NavigatorIOS.
In iOS I would achieve this using UINavigationController setViewControllers:animated:.
I have tried navigator.replace, navigator.replaceAtIndex but that doesn't quite work - it does replace the view but he navigation bar is hidden on the pushed screen (my login screen has it hidden, which is defined in its route properties), and there is no transition animation.
Another option that I tried is using navigator.pop followed by navigator.push. It did result in an animated transition but the login screen was still on the navigation stack (it wasn't popped) and the back button was visible.
What is the proper way to do this with NavigatorIOS?
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'm getting a weird bug since using PageMenu library. This library adds the ability to swipe between view controllers or change current view controller via UISegmentedControl (on the top).
When the view controller is a UINavigationController, all UIBarButtonItems in the navigation bar are sticking to the borders, like this :
The two items are sticking to the borders of the screen. The same thing happens with Back button after pushing to a view controller.
The bug disappear if I present a view controller modally in the app.
Does anybody has a solution for this ? Or at least a workaround to simulate "presenting a view controller modally" at app launch ?
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 created a Master/DetailView project on iOS for iPad. I set portrait mode only and I got my app running. In the detail view I added a UITableView with some customised cells (iOS settings style).
Fig. below: iOS settings menu. In my case when touching the margins of the UISlider in the brightness group I would some times summon the master view (which in my project I would like to disappear - differently from the settings menu of iOS).
However I got a little problem.. sometimes when I touch the margins of the cell the master view will appear and the action that I was doing in the cell gets void. Any idea on how I can stop the master view to be summoned by the detail view when the user touches the borders of the detail viewstrong text?
Try setting presentsWithGesture to false for your UISplitViewController.