特点
- 完美兼容
Objective-C
和swift
- 支持用户滑动和点击tab
- 支持滑动返回(在任意的tab)
- 支持
Frame
和Autolayout
自动布局,你可以使用Masonry
/SnapKit
/NSLayoutConstraint
去布局view - 支持放入普通的
UIView
(以及非滑动的UIView子类View
),UIScrollView
,UITableView
- 支持的
UITableView
添加tableHeaderView
- 支持
UITableView
添加 section header view,并且显示不会出现悬停位置不正确的情况 - 支持自定义
SegmentedControlView
(tab点选)的样式,你可以自己设置动画、自己设置高度等等等
UIView支持
UIScrollView 支持
UITableView 支持添加 tableHeaderView
UITableView 支持添加 section header
为什么做这个
现在很多类似的框架,但是还是做了一个,主要是因为网上大多数框架写死了SegmentedControlView
(就是tab的样式),另外最重要的一点是我试验过很多框架发现UITableView
的tableHeaderView
会有问题,而且一旦设置section header view,悬停都有问题,所以我就自己写了一个……
导入项目
CocoaPods
CocoaPods
是一个Cocoa项目管理器。你可以使用以下命令去安装CocoaPods
:
1 | $ gem install cocoapods |
要使用CocoaPods将TSegmentedView
集成到您的Xcode项目中,请在Podfile
中加入:
1 | source 'https://github.com/CocoaPods/Specs.git' |
然后运行一下命令:
1 | $ pod install |
Carthage
Carthage
是一个去中心化的依赖管理器,它构建并提供所使用的库的framework。
你可以使用 Homebrew
并运行下面的命令安装Carthage
1 | $ brew update |
要将TSegmentedView
集成到使用Carthage的Xcode项目中,请在Cartfile
中加入:
1 | github "tobedefined/TSegmentedView" ~> 1.0.2 |
运行carthage update
构建framework,并将编译的TSegmentedView.framework
拖入Xcode项目中。
如何使用
- swift
1 | import TSegmentedView |
- Objective-C
1 |
你可以在demo中看具体的使用方法,下面是具体的介绍
遵守协议: TSegmentedViewDelegate
1 | func segmentedViewTitles(in segmentedView: TSegmentedView) -> [String] |
- 第一个函数是给
TSegmentedView
没一个tab的title赋值,array的count是tab的数量 - 第二个函数是给对应每个tab赋予所显示的view
可选的协议函数
1 | // 1 |
可选函数解释
- 函数是在
index
对应的view显示时候会调用,每次都会调用 - 函数返回定义的
SegmentedControlView
(默认为TSegmentedControlView
) - 函数返回
TSegmentedView
创建时候选择哪一个tab(默认选择第一个tab–> index = 0) - 返回headerView(默认为nil)
- 设置header的最大高度(默认为header的frame的size.height)
- 设置header的最小高度(默认与最大高度相同)
- header高度发生变化时候会调用此函数,允许外面根据新的hight做一些动画等
- 函数是在
关于 TSegmentedControlProtocol
你可以看到在TSegmentedView.swift
中看到这个协议的定义
1 | protocol TSegmentedControlProtocol: class { |
作用:
TSegmentedView
允许用户自定义SegmentedControlView
而不是必须使用TSegmentedControlView
如何自定义
SegmentedControlView
首先创建的view必须是
UIView
的子类,然后符合TSegmentedControlProtocol
协议,并实现这三个方法func reloadData(with titles: [String]) -> Void
这个方法在
TSegmentedView
reloadData
的时候回去调用,这个方法中需要实现更新对应tab的view创建删除显示等操作,titles
的值为TSegmentedControlView
的代理方法返回的 arrayfunc userScrollExtent(_ extent: CGFloat) -> Void
这个方法在
TSegmentedView
滑动(用户手动滑动)的时候回去调用,这个方法中需要实现更新对应tab的view显示样式或自定义一些动画等,extent
的值为当前滑动的占比。例如有3个tab,则范围为0.0 ~ 2.0
func reloadData(with titles: [String]) -> Void
这个方法在
TSegmentedView
reloadData
的时候回去调用,这个方法中需要实现更新对应tab的view创建删除显示等操作func setAction(_ actionBlock: ((_ index: Int) -> Void)?) -> Void
这个方法需要你将
actionBlock
进行保存,并在点击tab时候进行调用actionBlock
,这样才会滚动到对应tab的view的位置。(刚开始考虑是在协议中定义一个actionBlock
的变量,为了兼容Objective-C
,所以还是定义成函数。)