前言:
Android上的ViewPager/ViewPager2为同级多页面切换带来了很好的体验。iOS系统中并没有提供类似的原生控件,如果要使用UIPagerViewController等进行自定义封装对于初学者而言难度则过高。这里uias提供了开源组件Tabman,其具有易理解、上手快等优点。鉴于网络上并没有几篇文章关于该组件的(也有寥寥几篇,质量实在难以恭维)介绍说明,本文将浅显地介绍其使用步骤。
使用步骤:
1:导入依赖
采用SPM的直接选择File->Swift Packages-> Add Package Dependency,键入如下内容一直Next即可
https://github.com/uias/Tabman
2:源码
这里写的有注释,有阅读基础的可直接看完,没有的看下面步骤也行:
import UIKit
import Tabman
import Pageboy
class ViewController: TabmanViewController, PageboyViewControllerDataSource, TMBarDataSource{
// Return ViewControllers's count.
func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int {
return viewControllers.count
}
// Return current index ViewController.
func viewController(for pageboyViewController: PageboyViewController,
at index: PageboyViewController.PageIndex) -> UIViewController? {
return viewControllers[index]
}
// Set default page.
func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? {
return nil
}
// Set BarItem's title.
func barItem(for bar: TMBar, at index: Int) -> TMBarItemable {
let title = "Page \(index)"
return TMBarItem(title: title)
}
// Set ViewController's instance count.
private var viewControllers = [YViewController(),EViewController(),SViewController()]
override func viewDidLoad() {
super.viewDidLoad()
// Set data source with self.
self.dataSource = self
// Create bar and set style.
let bar = TMBar.TabBar()
bar.layout.transitionStyle = .snap
// Add to view
addBar(bar, dataSource: self, at: .top)
}
}
3:继承,实现代理
正如上文代码所展示而言,首先我们创建的ViewController要继承于TabmanViewController
,然后实现PageboyViewControllerDataSource
, TMBarDataSource
这两个代理。实现完后系统会报错,点击修复即可,会出现如下几个方法:
func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int {}
:返回视图控制器的数量,也就是页面的数量;func viewController(for pageboyViewController: PageboyViewController, at index: PageboyViewController.PageIndex) -> UIViewController? {}
:返回当前视图控制器的索引,也就是当前位于第几个页面;func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? {}
:设置默认页面,如果为nil
,则默认返回数据源的第一个数据;func barItem(for bar: TMBar, at index: Int) -> TMBarItemable {}
:设置标题栏。
4:设置视图控制器实例源
这里用数组即可。
private var viewControllers = [YViewController(),EViewController(),SViewController()]
如上文所示,我采用的是YViewController(),EViewController(),SViewController()
,这三个自定义视图控制器,并分别设置其背景颜色为棕色,黄色,绿色。
5:设置代理
self.dataSource = self
6:设置标题样式
let bar = TMBar.TabBar()
bar.layout.transitionStyle = .snap
7:效果图