Reputation: 2730
I'm trying to create a tabbed application with navigation elements inside the tab bar, as seen in the picture below (the red bar) using Swift/XCode 6.2. Basically those three icons in the middle will direct the user to different view controllers. The other two icons would be context-based. For example, on a table view page you would see the menu icon and add new icon as seen in the image. However, clicking on a row would change the menu icon to a back icon, and the add icon to something else.
That's the general idea, but I'm having a very hard time implementing something even close to this. The first issue is that whenever I embed a view in a Tab Bar Controller, I can't move the tab bar to the top. However, when I create a custom UITabView in a View Controller, Control + Click and dragging a Tab Bar Item to another view doesn't create a segue. I haven't even begun to tackle having the navigation elements inside the bar.
I guess what I'm asking is just for a little guidance on what route to take to tackle this. I'm assuming I can't use a Tab Bar Controller or Navigation Controller because it doesn't seem like I can customize them all that much. So custom Tab Bar and Navigation Bars, and then implemnt the segues and button changes programmatically?
Thanks.
Upvotes: 6
Views: 17772
Reputation: 5953
I will try to guide you from an architectural perspective (so you won't find much code below).
In order to achieve what you are suggesting, you are right you cannot use a UITabBarController
straight away, among several reasons, the most immediate one is that they are meant to be always at the bottom and you want it in top (check Apple's docs). The good news is that probably you don't need it!
Note: If you still want to go with a UITabBarController
for whatever reason, please see @Matt's answer.
You can use a UINavigationController
to solve this task, since the UINavigationBar
of a UINavigationController
can be customized. There are multiple ways on how you can organize your view's hierarchy to achieve what you propose, but let me elaborate one option:
To customize a UINavigationBar
's to add buttons, you just need to set its navigationItem
's title view:
// Assuming viewWithTopButtons is a view containing the 3 top buttons
self.navigationItem.titleView = viewWithTopButtons
To add the burger menu functionality on a UINavigationController
you can find several posts on how to do it and infinite frameworks you can use. Check this other SO Question for a more detailed answer (e.g. MMDrawerController, ECSlidingViewController to mention a couple).
About organizing your view hierarchy, it really depends on if when the user taps one of the main top buttons, it will always go to the first view controller in the new section or if you want to bring him back to the last view in the section where he was.
3.1 Switching sections displays the first view of the new section
Your app's UIWindow
will have a single UINavigationController
on top of the hierarchy. Then each of the 3 top buttons, when tapped, will change the root view controller of the UINavigationController
.
Then, when the user changes section, the current navigation hierarchy is discarded by setting the new section view controller as the UINavigationController
root view controller.
self.navigationController = [sectionFirstViewController]
3.2 Switching sections displays the last displayed view in the new section
This will require a slightly modified version of the above, where your each of your sections will have its own UINavigationController
, so you can always keep a navigation hierarchy per section.
Then, when the user taps one of the top buttons to switch section, instead of changing as previously described, you will change the UIWindow
root view controller to the new section's UINavigationController
.
window.rootViewController = sectionNavigationController
Of course, the last and also very valid option would be that you implement yourself your own component to achieve your requirements. This is probably the option requiring the biggest effort in exchange of the highest customizability.
Choosing this option is definitely not recommend to less experienced developers.
Upvotes: 12
Reputation: 13511
I'd like to take a stab at this--I think it is possible to use a tab bar controller here.
UITabBarController
with a hidden UITabBar
.UINavigationController
.SwitchableViewController
).SwitchableViewController
's viewDidLoad
, you set the navigation item's title view (i.e. whatever's at the center; self.navigationItem.titleView
) to be the view that holds the three center buttons. Could be a UISegmentedControl
, or a custom view.UITabBarController
's selected index to the view controller you want to show.Issues you may encounter:
scrollIndicatorOffset
at the bottom even if the tab bar is hidden.
automaticallyAdjustsScrollViewInsets
of the tab bar controller, or the inner view controller. https://stackoverflow.com/a/29264073/855680Upvotes: 3