⭐️ 功能特点

📋 要求

Tabman 需要 iOS 12 或更高版本;并且兼容 Swift 5。

📲 安装

Swift Package Manager

Tabman 兼容 Swift Package Manager,可以通过 Xcode 集成。

CocoaPods

Tabman 也可通过 CocoaPods 获取

pod 'Tabman', '~> 3.2'

Carthage

Tabman 也可通过 Carthage 获取

github "uias/Tabman" ~> 3.2

🚀 用法

基础知识

  1. 使用您想要显示的视图控制器数组设置您的视图控制器。
  2. 设置 TabmanViewControllerPageboyViewControllerDataSource 数据源。
  3. 创建、自定义并添加任意数量的 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 指南。

  1. 配置您的数据源。
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 项目

bar 将为提供给 TabmanViewController dataSource 的每个页面请求一个 TMBarItemableTMBarItemable 是一个协议,可用于自定义项目类型,Tabman 中的默认类型是 TMBarItem

let item = TMBarItem()
item.title = "Item 1"
item.image = UIImage(named: "item.png")
item.badgeValue = "New"

UIKit Itemables

Tabman 还为一些原生 UIKit 类型提供作为 TMBarItemable 的支持

这些类型不幸地无法在设置属性时支持 bar 的动态更新。

选择外观

Tabman 提供了许多开箱即用的易于使用的模板样式

这些都作为 TMBar 的类型在 TMBar+Templates 中提供。

let bar = TMBar.ButtonBar()
let tabBar = TMBar.TabBar()

自定义

可以通过 bar 每个功能区域的属性进行 Bar 自定义。每个 bar 由 4 个不同的区域组成

TMBarView

TMBarView 是每个 bar 的根视图,并为网格化所有其他功能区域提供粘合剂。您可以在此处更改一些内容,例如背景样式和过渡行为。

bar.background.style = .blur(style: .extraLight)
bar.transitionStyle = .snap

这也是所有其他自定义的入口点。

🧲 关注的属性

更多信息:TMBarView 文档

TMBarLayout

TMBarLayoutTMBarView 的基础,决定了 bar 按钮的显示和布局方式。如果您想更改按钮间距、内容插图和其他布局相关的内容,请在此处查看。

bar.layout.contentInset = UIEdgeInsets(top: 0.0, left: 20.0, bottom: 0.0, right: 20.0)
🧲 关注的属性

更多信息:TMBarLayout 文档

TMBarButton

TMBarButton 视图填充在 TMBarLayout 中,并对应于数据源提供的项目。这是更改字体、图像大小和高亮颜色等内容的地方。

由于您很可能要处理多个按钮,您可以一次修改整个集合

bar.buttons.customize { (button) in
	button.tintColor = .orange
	button.selectedTintColor = .red
}

这将应用于现有的 bar 按钮以及之后添加到 bar 的任何按钮。

🧲 关注的属性

更多信息:TMBarButton 文档

TMBarIndicator

最后是 TMBarIndicator - 它指示 bar 的当前页面索引状态。您可以在此处更改行为特征以及指示器的外观。

bar.indicator.overscrollBehavior = .compress
bar.indicator.weight = .heavy
🧲 关注的属性

更多信息: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 中可用

Bar 布局

Bar 按钮

Bar 指示器

完全自定义

由于替换布局、按钮或指示器的类型与上述一样容易;您可以定义自己的子类,而不会有太多麻烦。

自定义 Tabman 组件

还有示例项目展示了自定义布局等

📐 内容插图

Tabman 自动调整其子视图控制器中的任何内容插图,以便其在任何可见的 bar 下正确显示。它提供以下行为

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 许可证 的条款以开源形式提供。