【问题标题】:Custom Tab Bar iOS自定义标签栏 iOS
【发布时间】:2017-12-25 21:31:00
【问题描述】:
我想创建一个如图所示的自定义标签栏。我不知道如何开始子类化UITabBar 以获得这个结果。
如果我只是有一个根UIViewController,并通过interface builder(一个UIView、图像、圆形按钮等)创建标签栏的感知,并为地图和列表UIViewController添加ContainerView,该怎么办?这种方法的缺点是什么(如果有的话)?调整大小问题(在 iPhone 6 上看起来不错,但在 iPhone X 上看起来不错),因为可能没有标签栏来动态调整大小?
【问题讨论】:
标签:
ios
swift
user-interface
uitabbarcontroller
uitabbar
【解决方案1】:
当您分解任何UIKit 组件时,例如UITabBar,您将找到的只是其他UIKit 组件,我们都可以使用这些组件。虽然有时使用 Apple 的预构建东西很好,但它们并不总是喜欢我们插手它们,而且它们经常隐藏我们想要修改的行为。
您应该对创建自己的 UI 组件(例如自定义标签栏)完全零恐惧,对于我们的目的而言,它只不过是带有 UIButton 或 UIImageView 子视图的 UIView 容器。如果您有一个容器视图控制器(包含子视图控制器),将标签栏放在那里,您将拥有一个合法的标签栏,它将始终叠加在内容视图控制器上,除了呈现的视图控制器(这正是我们想要的行为)。
就 iPhone X 和安全区域而言,只需按照您通常的视图方式应用它们,因为这就是您的自定义标签栏的全部内容:
if #available(iOS 11.0, *) {
tabBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
tabBar.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor).isActive = true
tabBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
} else {
tabBar.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
tabBar.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
tabBar.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
}
tabBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
关于调整大小的问题,如果你在容器视图控制器中给你的标签栏约束(就像你应该做的那样),它会以各种可能的方式拉伸和旋转而不会失败。