这两天趁着在公司里继续做着不爱做的需求的空隙,将很多App 常用的滑动视图控制器按照自己的想法造了个轮子,在这记录下整个流程。
Demo 地址
GitHub
演示:
介绍
1.CocoaPods
|
|
2.Demo 使用
|
|
更多使用方法请看Demo
原理
构成
主要分两个部分:
- 上方的TabBar(UICollectionView 构成)
- 下方的容器ContentView(UIScrollView 构成)
|
|
目录结构
流程
- 通过数据源获取子Controller 的数量,以及相应索引上tabBar 的宽度和title。
- 通过数据源获取相应索引上的Controller,先判断如果有相同identifier 的可复用Controller,若有,则返回,否则创建该Controller,存入到缓存中。
- 当手势滑动ContentView 或点击TabBar 来切换页面时,处理ContentView 与TabBar 之间的协同问题。
主要逻辑
首先是重用Controller,这个对提高性能很重要,我是将Controller 都存到controllersMap 这个字典里,用 @“index_identifier” 来当做key,同一个identifier 的Controller 最多创建两个。
|
|
为了性能考虑,只有当每次滑动即将出现某个index 对应的Controller 时,才去创建该Controller,将其add 到ContentView 相应的ContentOffset 上的。
手势滑动切换页面时,主要逻辑在scrollViewDidScroll
这个方法里,先判断滑动方向,然后配置相应的Controller。
|
|
当点击tabBar 切换页面时,主要实现JCPageSlideBarDelegate 代理方法,将nextVCL 放在当前Controller 相邻位置上,待滚动结束后在恢复真正位置。
|
|
默认提供了四种line 的切换动画
|
|
其中拉伸效果需要计算当前切换页面滑动的progress ,以此来计算line 的origin.x 以及width。
这里也提供了tabBar 选中放大效果以及title 颜色渐变,,主要使用的是CGAffineTransformMakeScale
,
|
|
|
|
总结
由于自身的能力以及是第一版,尚且存在很多不足之处,例如不能自由的定制化,代码注释不够,一些方法逻辑躲起来不够顺畅,总的来说还是可以满足基本需求。日后有时间将会继续完善。欢迎大家指出问题,一起交流。
Demo 地址
GitHub