我正在尝试使用Swift / XCode 6.2在标签栏中创建带有导航元素的选项卡式应用程序,如下图(红色条)所示。基本上,中间的这三个图标将引导用户到不同的视图控制器。其他两个图标将基于上下文。例如,在表格视图页面上,您将看到菜单图标并添加新图标,如图所示。但是,单击一行会将菜单图标更改为后退图标,将添加图标更改为其他内容。
这是一般的想法,但我很难实现甚至接近这个的东西。第一个问题是每当我在一个标签栏控制器中嵌入一个视图时,我都无法将标签栏移动到顶部。但是,当我在视图控制器中创建自定义UITabView时,按住Control并单击并将标签栏项目拖动到另一个视图不会创建segue。我甚至没有开始解决在栏内导航元素的问题。
我想我要问的只是为了解决这个问题的路线。我假设我不能使用标签栏控制器或导航控制器,因为它似乎我不能自定义它们。那么自定义标签栏和导航栏,然后以编程方式实现segue和按钮更改?
感谢。
答案 0 :(得分:12)
我将尝试从架构角度引导您(因此您将在下面找不到太多代码)。
为了达到你的建议,你是对的你不能直接使用UITabBarController
,在几个原因中,最直接的一个是它们意味着< strong>总是在底部,你想要它在顶部(检查Apple's docs)。好消息是,你可能不需要它!
注意:如果您因任何原因仍想使用UITabBarController
,请参阅@ Matt的answer。
您可以使用UINavigationController
来解决此任务,因为UINavigationBar
的{{1}}可以自定义。有多种方法可以组织视图的层次结构来实现您的建议,但让我详细说明一个选项:
要自定义UINavigationController
以添加按钮,您只需要设置其UINavigationBar
的标题视图:
navigationItem
要在// Assuming viewWithTopButtons is a view containing the 3 top buttons
self.navigationItem.titleView = viewWithTopButtons
上添加 汉堡菜单功能,您可以找到关于如何操作的several posts它和你可以使用的无限框架。请查看其他SO Question以获取更详细的答案(例如MMDrawerController,ECSlidingViewController提及一对夫妇。)
关于组织视图层次结构,它实际上取决于当用户点击其中一个主要顶部按钮时,它将始终转到新部分中的第一个视图控制器,或者是否要将其带回他所在部分的最后一个观点。
3.1切换部分显示新部分的第一个视图
您的应用UINavigationController
将在层次结构的顶部有一个UIWindow
。然后点击3个顶部按钮中的每一个将更改UINavigationController
的根视图控制器。
然后,当用户更改部分时,通过将新的部分视图控制器设置为UINavigationController
根视图控制器,当前导航层次结构将被丢弃。
UINavigationController
3.2切换部分显示新部分中最后显示的视图
这需要稍微修改上述版本,您的每个部分都有自己的self.navigationController = [sectionFirstViewController]
,因此您始终可以为每个部分保留导航层次结构。
然后,当用户点击其中一个顶部按钮切换部分,而不是如前所述进行更改时,您将UINavigationController
根视图控制器更改为新部分的UIWindow
。
UINavigationController
当然,最后也是非常有效的选择是您自己实现自己的组件以满足您的要求。这可能是需要付出最大努力以换取最高可定制性的选项。
对于缺乏经验的开发人员,绝对不建议选择此选项。
答案 1 :(得分:3)
我想对此嗤之以鼻 - 我认为可以在这里使用标签栏控制器。
UITabBarController
的{{1}}。UITabBar
。UINavigationController
)。SwitchableViewController
&#39; SwitchableViewController
中,您可以设置导航项的标题视图(即中心的任何内容; viewDidLoad
)包含三个中心按钮的视图。可以是self.navigationItem.titleView
,也可以是自定义视图。UISegmentedControl
所选索引更改为您要显示的视图控制器。您可能遇到的问题:
UITabBarController
。
scrollIndicatorOffset
或内部视图控制器。 https://stackoverflow.com/a/29264073/855680