UITabBarController

一个容器视图控制器,管理radio-style的选择界面,其中的选择确定要显示的子视图控制器。

class UITabBarController : UIViewController

使用教程

标签栏界面在窗口底部显示标签,用于在不同模式之间进行选择并显示该模式的视图。此类通常按原样使用,但也可以子类化。

标签栏控制器界面的每个标签都与一个自定义视图控制器关联。当用户选择特定的选项卡时,选项卡栏控制器将显示相应视图控制器的根视图,以替换任何先前的视图。 (用户抽头始终显示该选项卡的根视图,而不管先前是否选择了哪个选项卡。即使已经选择了该选项卡,也是如此。)由于选择一个选项卡会替换界面的内容,因此在每个选项卡中管理的界面类型标签不必有任何相似之处。实际上,标签栏界面通常用于呈现不同类型的信息或使用完全不同的界面样式呈现相同的信息。图1显示了Clock应用程序提供的选项卡栏界面,其每个选项卡都提供了一种基于时间的信息。






SwiftUI HStack换行方法 swiftui tabbar_选项卡


UITabBarController


您永远不要直接访问标签栏控制器的标签栏视图。要配置选项卡栏控制器的选项卡,可将为每个选项卡提供根视图的视图控制器分配给viewControllers属性。指定视图控制器的顺序决定了它们在选项卡栏中的显示顺序。设置此属性时,还应该为selectedViewController属性分配一个值,以指示最初选择了哪个视图控制器。 (您也可以使用selectedIndex属性通过数组索引选择视图控制器。)将标签栏控制器的视图(使用继承的view属性获得)嵌入到应用程序窗口中时,标签栏控制器会自动选择该视图控制器并显示其内容,并根据需要调整其大小以适合标签栏界面。

标签栏项目通过其相应的视图控制器进行配置。要将标签栏项目与视图控制器相关联,请创建UITabBarItem类的新实例,为视图控制器进行适当配置,然后将其分配给视图控制器的tabBarItem属性。如果您不为视图控制器提供自定义标签栏项目,则视图控制器会创建一个默认项目,其中不包含图像和视图控制器的title属性中的文本。

当用户与标签栏界面交互时,标签栏控制器对象会将有关交互的通知发送到其委托。委托可以是您指定的任何对象,但必须符合UITabBarControllerDelegate协议。您可以使用委托来防止选择特定的选项卡栏项目,并在选择选项卡时执行其他任务。您还可以使用委托来监视“更多”导航控制器对选项卡栏所做的更改,“更多导航控制器”中对此进行了详细说明。

标签栏控制器的视图

因为UITabBarController类继承自UIViewController类,所以选项卡栏控制器具有自己的视图,可通过view属性访问该视图。 标签栏控制器的视图只是标签栏视图和包含自定义内容的视图的容器。 标签栏视图为用户提供选择控件,并由一个或多个标签栏项目组成。 图2显示了如何组装这些视图以显示整个标签栏界面。 尽管选项卡栏和工具栏视图中的项目可以更改,但管理它们的视图不能更改。 只有自定义内容视图会更改,以反映当前所选选项卡的视图控制器。

图2标签栏控制器的主要视图


SwiftUI HStack换行方法 swiftui tabbar_标签栏_02


签栏控制器的主要视图


您可以将导航控制器或自定义视图控制器用作选项卡的根视图控制器。如果根视图控制器是导航控制器,则选项卡栏控制器会进一步调整显示的导航内容的大小,以使其不与选项卡栏重叠。因此,在选项卡栏界面中显示的任何视图都应设置其autoresizingMask属性,以在任何情况下适当调整视图的大小。

更多导航控制器

标签栏的空间有限,无法显示您的自定义项目。如果将六个或更多的自定义视图控制器添加到选项卡栏控制器,则选项卡栏控制器仅显示前四个项目以及选项卡栏上的标准“更多”项目。轻触“更多”项目会弹出一个标准界面,用于选择其余项目。

标准“更多”项目的界面包括“编辑”按钮,该按钮允许用户重新配置选项卡栏。默认情况下,允许用户重新排列选项卡栏上的所有项目。但是,如果您不希望用户修改某些项目,则可以在customizableViewControllers属性中从数组中删除相应的视图控制器。

注意,标签栏自定义和更多界面在tvOS中不可用。

State保护

在iOS 6及更高版本中,如果您为该视图控制器的restoreIdentifier属性分配一个值,它将在所选标签中保留对视图控制器的引用。在还原时,它使用引用来选择具有相同视图控制器的选项卡。

保留选项卡栏控制器时,将唯一的还原标识符分配给要保留的子视图控制器。从子视图控制器省略恢复标识符会使该选项卡返回其默认配置。尽管选项卡栏控制器以与viewControllers属性中列出的选项卡相同的顺序保存其选项卡,但保存顺序实际上无关紧要。您的代码负责在下一个启动周期中提供新的标签栏控制器,因此您的代码可以根据需要调整标签的顺序。状态保存系统基于分配的还原标识符而不是基于标签的位置来还原每个标签的内容。

有关状态保存和还原如何工作的更多信息,请参阅《 iOS App编程指南》。

iOS和tvOS之间的差异

标签栏控制器在tvOS中的用途与在iOS中相同,但提供的用户界面功能略有不同:

在tvOS中,选项卡栏界面显示在窗口顶部。当焦点离开标签栏时,默认情况下,标签栏固定在屏幕顶部。要创建一个界面,其中选项卡栏不会保持固定,而是随内容滚动,请将tabBarObservedScrollView属性设置为适当的滚动视图。在iOS中,标签栏始终固定在屏幕底部。

在tvOS中,从选项卡栏向下滑动可将焦点移到内容视图中。具体来说,是位于选定标签下方的第一个可聚焦视图。向下滑动的行为就像正常的焦点更改手势一样,也就是说,焦点向用户滑动的方向移动。如果在所选选项卡的正下方没有可聚焦的对象,则将聚焦最近的可聚焦视图。在iOS中,标签栏始终保持焦点在屏幕底部。

在tvOS中,当标签处于焦点状态时按“选择”按钮会将焦点移到内容视图中。因为没有与此更改相关的方向,所以焦点将移动到内容视图的preferredFocusEnvironments属性中指定的最合适的视图。在iOS中,没有在视图之间聚焦的概念。

tvOS中的标签栏控制器不支持自定义。标签栏控制器仅显示其适合屏幕显示的viewControllers数组中的视图控制器数量,并且不提供在iOS中看到的More界面。