Xcode 6 – Swift – 带导航的自定义Tabbar

我试图创build一个标签栏中的导航元素的选项卡式应用程序,如下图所示(红色栏)使用Swift / XCode 6.2。 基本上这三个中间的图标将引导用户不同的视图控制器。 其他两个图标将基于上下文。 例如,在桌面视图页面上,您将看到菜单图标并添加新图标,如图中所示。 但是,单击一行可以将菜单图标更改为后退图标,将添加图标更改为其他内容。

这是一般的想法,但我很难实现甚至接近这一点。 第一个问题是,无论何时在Tab Bar Controller中embedded视图,我都无法将标签栏移动到顶部。 但是,当我在View Controller中创build一个自定义的UITabView时,Control +单击并拖动一个Tab Bar Item到另一个视图不会创build一个Segue。 我甚至没有开始处理酒吧内的导航元素。

我想我要问的只是一点点的指导,要采取什么样的方式来解决这个问题。 我假设我不能使用标签栏控制器或导航控制器,因为它似乎并不像我可以自定义它们那么多。 所以自定义选项卡栏和导航栏,然后以编程方式实现segues和button更改?

谢谢。

标签栏与导航

我将尝试从架构的angular度来指导你(所以你不会在下面find很多代码)。

使用UITabBarController

为了实现你的build议,你是正确的, 你不能马上使用UITabBarController ,有几个原因,最直接的就是它们总是处于底层,而且你希望它在顶端(检查苹果的文档 ) 。 好消息是,你可能不需要它!

注意:如果你仍然想用任何理由去使用UITabBarController ,请看@ Matt的答案 。

使用UINavigationController

您可以使用UINavigationController来解决此任务,因为可以自定义UINavigationBarUINavigationController 。 关于如何组织视图的层次结构来实现您的build议,有多种方法,但让我详细说明一个选项:

  1. 要定制一个UINavigationBar来添加button,你只需要设置它的navigationItem的标题视图

     // Assuming viewWithTopButtons is a view containing the 3 top buttons self.navigationItem.titleView = viewWithTopButtons 
  2. UINavigationController添加汉堡菜单function,你可以find几个关于如何做的文章和你可以使用的无限框架。 检查这个其他SO问题的更详细的答案(例如MMDrawerController , ECSlidingViewController提到一对夫妇)。

  3. 关于组织你的视图层次结构,实际上取决于当用户点击其中一个主要的顶部button时,它将一直到新部分中的第一个视图控制器,或者如果你想把他带回到部分的最后一个视图他在哪里。

    3.1切换部分显示新部分的第一个视图

    您的应用程序的UIWindow将在层次结构的顶部具有一个UINavigationController 。 然后点击3个顶部button中的每一个,都将更改UINavigationController的根视图控制器。

    然后,当用户改变区段时,通过将新的区段视图控制器设置为UINavigationController根视图控制器来丢弃当前的导航层次

     self.navigationController = [sectionFirstViewController] 

    3.2切换部分显示新部分中最后显示的视图

    这将需要稍微修改一下上面的版本,其中你的每个部分都有自己的UINavigationController ,所以你可以随时保持每个部分的导航层次结构。

    然后,当用户点击其中一个顶部button切换部分,而不是如前所述的更改,您将更改UIWindow根视图控制器到新部分的UINavigationController

     window.rootViewController = sectionNavigationController 

使用自定义实现

当然,最后也是非常有效的select是你自己实现你自己的组件来实现你的要求。 这可能是需要最大努力来交换最高可定制性的选项。

select这个选项绝对不推荐给经验较less的开发者。

我想刺穿这个 – 我认为可以在这里使用标签栏控制器。

  • 你最顶层的视图控制器将是一个带有隐藏的UITabBar
  • 每个选项卡都包含在UINavigationController
  • 导航控制器中的所有视图控制器都是视图控制器的一个子类(比如说SwitchableViewController )。
  • SwitchableViewControllerviewDidLoad ,您将导航项目的标题视图(即无论在中心; self.navigationItem.titleView )设置为包含三个中心button的视图。 可能是UISegmentedControl或自定义视图。
  • 每当你点击任何一个button,你把最上面的UITabBarController的选定索引改变成你想要显示的视图控制器。

您可能遇到的问题:

  • 即使标签栏被隐藏,标签内的表格视图底部也会有一个scrollIndicatorOffset
  • 每当您在导航堆栈中推送新的视图控制器时,您的标题视图将会生成animation。
    • 解决scheme:看看为UINavigationController创build一个自定义过渡animation。