Tabman 需要 iOS 12 或更高版本;并且兼容 Swift 5。
Tabman 兼容 Swift Package Manager,可以通过 Xcode 集成。
Tabman 也可通过 CocoaPods 获取
pod 'Tabman', '~> 3.2'
Tabman 也可通过 Carthage 获取
github "uias/Tabman" ~> 3.2
TabmanViewController
的 PageboyViewControllerDataSource
数据源。TMBar
。import Tabman
import Pageboy
class TabViewController: TabmanViewController {
private var viewControllers = [UIViewController(), UIViewController()]
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
// Create bar
let bar = TMBar.ButtonBar()
bar.layout.transitionStyle = .snap // Customize
// Add to view
addBar(bar, dataSource: self, at: .top)
}
}
添加 bar 时,您可以选择将其添加到预定义的区域(.top
、.bottom
、.navigationItem(item:)
)或使用 .custom(view:layout:)
添加到自定义视图。有关更多信息,请阅读 添加 Bar 指南。
extension TabViewController: PageboyViewControllerDataSource, TMBarDataSource {
func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int {
return viewControllers.count
}
func viewController(for pageboyViewController: PageboyViewController,
at index: PageboyViewController.PageIndex) -> UIViewController? {
return viewControllers[index]
}
func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? {
return nil
}
func barItem(for bar: TMBar, at index: Int) -> TMBarItemable {
let title = "Page \(index)"
return TMBarItem(title: title)
}
}
bar 将为提供给 TabmanViewController
dataSource
的每个页面请求一个 TMBarItemable
。TMBarItemable
是一个协议,可用于自定义项目类型,Tabman 中的默认类型是 TMBarItem
let item = TMBarItem()
item.title = "Item 1"
item.image = UIImage(named: "item.png")
item.badgeValue = "New"
Tabman 还为一些原生 UIKit
类型提供作为 TMBarItemable
的支持
UINavigationItem
UITabBarItem
这些类型不幸地无法在设置属性时支持 bar 的动态更新。
Tabman 提供了许多开箱即用的易于使用的模板样式
这些都作为 TMBar
的类型在 TMBar+Templates 中提供。
let bar = TMBar.ButtonBar()
let tabBar = TMBar.TabBar()
可以通过 bar 每个功能区域的属性进行 Bar 自定义。每个 bar 由 4 个不同的区域组成
TMBarView
是每个 bar 的根视图,并为网格化所有其他功能区域提供粘合剂。您可以在此处更改一些内容,例如背景样式和过渡行为。
bar.background.style = .blur(style: .extraLight)
bar.transitionStyle = .snap
这也是所有其他自定义的入口点。
backgroundView
- TMBarBackgroundView
,提供背景样式。scrollMode
- 允许的交互式滚动类型。fadesContentEdges
- 是否在 bar 内容超出屏幕时淡化其边缘。更多信息:TMBarView 文档
TMBarLayout
是 TMBarView
的基础,决定了 bar 按钮的显示和布局方式。如果您想更改按钮间距、内容插图和其他布局相关的内容,请在此处查看。
bar.layout.contentInset = UIEdgeInsets(top: 0.0, left: 20.0, bottom: 0.0, right: 20.0)
contentMode
- 布局应如何显示其内容;要么限制为 bar 宽度 .fit
,要么使用固有大小 .intrinsic
。contentInset
- 要应用于布局边缘的插图。transitionStyle
- 布局应如何执行过渡动画。alignment
- 布局应如何在 bar 中对齐。更多信息:TMBarLayout 文档
TMBarButton
视图填充在 TMBarLayout
中,并对应于数据源提供的项目。这是更改字体、图像大小和高亮颜色等内容的地方。
由于您很可能要处理多个按钮,您可以一次修改整个集合
bar.buttons.customize { (button) in
button.tintColor = .orange
button.selectedTintColor = .red
}
这将应用于现有的 bar 按钮以及之后添加到 bar 的任何按钮。
backgroundView
- TMBarBackgroundView
,提供背景样式。contentInset
- 要应用于按钮边缘的插图。transitionStyle
(TMBarButtonCollection
) - 按钮应如何执行过渡动画。badge
- TMBadgeView
,显示来自 bar 项目的 badgeValue
。更多信息:TMBarButton 文档
最后是 TMBarIndicator
- 它指示 bar 的当前页面索引状态。您可以在此处更改行为特征以及指示器的外观。
bar.indicator.overscrollBehavior = .compress
bar.indicator.weight = .heavy
overscrollBehavior
- 指示器应如何处理超出 bar 项目边界的滚动。isProgressive
- 指示器在通过页面索引过渡时是否应逐步执行。transitionStyle
- 指示器应如何执行过渡动画。更多信息:TMBarIndicator 文档
Tabman 提供了完全的自由来混合搭配内置组件;并且还可以定义您自己的组件。
TMBarView
利用泛型来定义和提供 bar 的三个不同功能区域。这意味着...
// ...that the preset...
let bar = Bar.ButtonBar()
// ...is actually under the hood:
let bar = BarView<HorizontalBarLayout, LabelBarButton, LineBarIndicator>
因此,更换另一种布局、按钮或指示器类型再简单不过了。
假设您实际上想使用 DotBarIndicator
而不是 LineBarIndicator
let bar = BarView<HorizontalBarLayout, LabelBarButton, DotBarIndicator>
以下组件在 Tabman 中可用
TMHorizontalBarLayout
- 沿水平轴顺序显示 bar 按钮的布局。TMConstrainedHorizontalBarLayout
- 沿水平轴顺序显示 bar 按钮的布局,但受其可以显示的项目数量的限制。TMLabelBarButton
- 包含单个文本标签的按钮。TMTabItemBarButton
- 模仿 UITabBarItem
外观的按钮,包含垂直对齐的图像和标签。TMBarButton.None
- 不显示可见的 bar 按钮。TMLineBarIndicator
- 简单指示器,显示为水平线。TMChevronBarIndicator
- 指示器,显示沿 X 轴居中的垂直人字形。TMBlockBarIndicator
- 填充 bar 的指示器,显示纯色。TMDotBarIndicator
- 指示器,显示沿 X 轴居中的圆形点。TMBarIndicator.None
- 不显示可见的指示器。由于替换布局、按钮或指示器的类型与上述一样容易;您可以定义自己的子类,而不会有太多麻烦。
还有示例项目展示了自定义布局等
Tabman 自动调整其子视图控制器中的任何内容插图,以便其在任何可见的 bar 下正确显示。它提供以下行为
UIScrollView
或派生子类适当更新 contentInset
和 contentOffset
。additionalSafeAreaInsets
以反映所需的安全区域,包括 bar 内容。约束到子视图控制器中安全区域的任何视图都将正确布局(仅在 iOS 11 及更高版本中可用。)TabmanViewController
还提供 barLayoutGuide
,一个 UILayoutGuide
,它提供顶部和底部锚点,考虑到添加到 .top
或 .bottom
TabmanViewController.BarLocation
区域的任何 bar。原始 UIEdgeInsets
也可通过 .barInsets
获得。
可以通过将 automaticallyAdjustsChildInsets
设置为 false
来禁用自动插图 - 但这必须在 viewDidLoad
之前完成。
对于添加到自定义视图的 bar,Tabman 不会提供任何插图行为。
如果您在使用 Tabman 时遇到问题,请查看 故障排除指南。
如果您仍然遇到问题,请随时提出 issue。
欢迎在 GitHub 上提交 bug 报告和 pull request:https://github.com/uias/Tabman。
该库根据 MIT 许可证 的条款以开源形式提供。