![LOGO](https://github.com/Roylee-ML/SwipeTableView/blob/master/ScreenShots/logo.png)
[![CocoaPods](https://img.shields.io/badge/pod-v0.2.4-28B9FE.svg)](http://cocoapods.org/pods/SwipeTableView)
![Platforms](https://img.shields.io/badge/platforms-iOS-orange.svg)
[![License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://github.com/Roylee-ML/SwipeTableView/blob/master/License)
功能类似半糖首页菜单与QQ音乐歌曲列表页面。即支持UITableview的上下滚动,同时也支持不同列表之间的滑动切换。同时可以设置顶部header view与列表切换功能bar,使用方式类似于原生UITableview的tableHeaderView的方式。 [`Engilish→`](https://github.com/Roylee-ML/SwipeTableView/blob/master/README_EN.md)
****
# 预览
<img src="https://github.com/Roylee-ML/SwipeTableView/blob/master/ScreenShots/screenshot1.gif" width = "290" height = "517" alt="OverView1" align=center />
<img src="https://github.com/Roylee-ML/SwipeTableView/blob/master/ScreenShots/screenshot2.gif" width = "290" height = "517" alt="OverView1" align=center />
<img src="https://github.com/Roylee-ML/SwipeTableView/blob/master/ScreenShots/screenshot3.gif" width = "290" height = "517" alt="OverView1" align=center />
# 使用 Cocoapods 导入
SwipeTableView is available on [CocoaPods](http://cocoapods.org). Add the following to your Podfile:
```ruby
pod 'SwipeTableView'
```
# 目录
1. [实现原理](https://github.com/Roylee-ML/SwipeTableView/blob/master/README.md#实现的原理)
2. [基本用法](https://github.com/Roylee-ML/SwipeTableView/blob/master/README.md#怎样使用使用方式类似uitableview)
3. [下拉刷新](https://github.com/Roylee-ML/SwipeTableView/blob/master/README.md#如何支持下拉刷新)
4. [混合模式](https://github.com/Roylee-ML/SwipeTableView/blob/master/README.md#混合模式uitableview--uicollectionview--uiscrollview)
5. [示例代码](https://github.com/Roylee-ML/SwipeTableView/blob/master/README.md#示例代码)
6. [Demo介绍](https://github.com/Roylee-ML/SwipeTableView/blob/master/README.md#使用的详细用法在swipetableviewdemo文件夹中提供了五种示例)
## 实现的原理
>为了兼容下拉刷新,采用了两种实现方式,但基本构造都是一样的
### Mode 1
![Mode 1](https://github.com/Roylee-ML/SwipeTableView/blob/master/ScreenShots/SwipeTableViewStruct1.png)
1. 使用`UICollectionView`作为item的载体,实现左右滑动的功能。
2. 在支持左右滑动之后,最关键的问题就是是滑动后相邻item的对齐问题。
>为实现前后item对齐,需要在itemView重用的时候,比较前后两个itemView的contentOffset,然后设置后一个itemView的contentOffset与前一个相同。这样就实现了左右滑动后前后itemView的offset是对齐的。
3. 由于多个item共用一个header与bar,所以,header与bar必须是根视图的子视图,即与CollectionView一样是`SwipeTableView`的子视图,并且在CollectionView的图层之上。
>headr & bar的滚动与悬停实现是,对当前的itemView的contentOffset进行KVO。然后在当前itemView的contentOffset发生变化时,去改变header与bar的Y坐标值。
4. 顶部header & bar在图层的最顶部,所以每个itemView的顶部需要做出一个留白来作为header & bar的显示空间。在`Mode 1`中,采用修改`UIScrollView`的contentInsets的top值来留出顶部留白。
5. 由于header在图层的最顶部,所以要实现滑动header的同时使当前itemView跟随滚动,需要根据header的frame的变化回调给当前的itemView来改变contentOffset,同时也要具有ScrollView的弹性等效果。
>这里采用`UIKit Dynamic`物理动画引擎自定义`STHeaderView`实现自定义`UIScrollView`效果解决上述问题 [`参考文章`](http://philcai.com/2016/03/15/%E7%94%A8UIKit-Dynamics%E6%A8%A1%E4%BB%BFUIScrollView/) [`英文博客`](http://holko.pl/2014/07/06/inertia-bouncing-rubber-banding-uikit-dynamics/)。
### Mode 2
![Mode 2](https://github.com/Roylee-ML/SwipeTableView/blob/master/ScreenShots/SwipeTableViewStruct2.png)
1. 在`Mode 2`中,基本结构与`Mode 1`一样,唯一的不同在于每个itemView顶部留白的的方式。
>通过设置`UITabelView`的`tableHeaderView`,来提供顶部的占位留白,CollectionView采用自定义`STCollectionView`的`collectionHeaderView`来实现占位留白。(目前不支持`UIScrollView`)
2. 如何设置区分`Mode 1`与`Mode 2`模式?
>正常条件下即为`Mode 1`模式;在`SwipeTableView.h`中或者在工程PCH文件中设置宏`#define ST_PULLTOREFRESH_HEADER_HEIGHT xx`设置为`Mode 2`模式。
## 使用用法
### 怎样使用?使用方式类似UITableView
**实现 `SwipeTableViewDataSource` 代理的两个方法:**
```objc
- (NSInteger)numberOfItemsInSwipeTableView:(SwipeTableView *)swipeView
```
>返回列表item的个数
```objc
- (UIScrollView *)swipeTableView:(SwipeTableView *)swipeView viewForItemAtIndex:(NSInteger)index reusingView:(UIScrollView *)view
```
>返回对应index下的itemView,返回的视图类型需要是`UIScrollView`及其子类:`UITableView`或者`UICollectionView`。这里采用重用机制,需要根据reusingView来创建单一的itemView。
**使用的`swipeHeaderView`必须是`STHeaderView`及其子类的实例。**
### 如何支持下拉刷新?
>**下拉刷新有两种实现方式,一种用户自定义下拉刷新组件(局部修改自定义),一种是简单粗暴设置宏:**
**1. 一行代码支持常用的下拉刷新控件,只需要在项目的PCH文件中或者在`SwipeTableView.h`文件中设置如下的宏:**
```objc
#define ST_PULLTOREFRESH_HEADER_HEIGHT xx
```
>上述宏中的`xx`要与您使用的第三方下拉刷新控件的refreshHeader高度相同:
`MJRefresh` 为 `MJRefreshHeaderHeight`,`SVPullToRefresh` 为 `SVPullToRefreshViewHeight`(注:此时视图结构为`Model 2`)
新增下拉刷新代理,可以控制每个item下拉临界高度,并自由控制每个item是否支持下拉刷新
```objc
- (BOOL)swipeTableView:(SwipeTableView *)swipeTableView shouldPullToRefreshAtIndex:(NSInteger)index
```
>根据item所在index,设置item是否支持下拉刷新。**在设置`#define ST_PULLTOREFRESH_HEADER_HEIGHT xx`的时候默认是YES(全部支持),否则默认为NO。**
```objc
- (CGFloat)swipeTableView:(SwipeTableView *)swipeTableView heightForRefreshHeaderAtIndex:(NSInteger)index
```
>返回对应item下拉刷新的临界高度,如果没有实现此代理,在设置`#define ST_PULLTOREFRESH_HEADER_HEIGHT xx`的时候默认是`ST_PULLTOREFRESH_HEADER_HEIGHT`的高度。**如果没有设置宏,并且想要自定义修改下拉刷新,必须实现此代理,提供下拉刷新控件RefreshHeader的高度(RefreshHeader全部露出的高度),来通知`SwipeTableView`触发下拉刷新。**
**2. 如果想要更好的扩展性,以及喜欢自己研究的同学,可以尝试修改或者自定义下拉控件来解决下拉刷新的兼容问题,同时这里提供一些思路:**
如果下拉刷新控件的frame是固定的(比如header的frame),这样可以在初始化下拉刷新的header或者在数据源的代理中重设下拉header的frame。
>获取下拉刷新的header,将header的frame的y值减去`swipeHeaderView`与`swipeHeaderBar`的高度和(或者重写RefreshHeader的setFrame方法),就可以消除itemView contentInsets顶部留白top值的影响(否则添加的下拉header是隐藏在底部的)。
```objc
- (UIScrollView *)swipeTableView:(SwipeTableView *)swipeView viewForItemAtIndex:(NSInteger)index reusingView:(UIScrollView *)view {
...
STRefreshHeader * header = scrollView.header;
header.y = - (header.height + (swipeHeaderView.height + swipeHeaderBar.height));
...
}
or
- (instancetype)initWithFrame:(CGRect)frame {
...
STRefreshHeader * h
没有合适的资源?快使用搜索试试~ 我知道了~
顶部表头与下方多个tableview联动实例
共54个文件
m:16个
h:15个
png:5个
需积分: 35 15 下载量 7 浏览量
2017-08-22
10:34:51
上传
评论 1
收藏 13.92MB ZIP 举报
温馨提示
顶部有表头,表头下方有多个可横向左右滑动的tableview,tableview与表头保持联动
资源推荐
资源详情
资源评论
收起资源包目录
SwipeTableView-master.zip (54个子文件)
SwipeTableView-master
README_EN.md 16KB
SwipeTableView
SwipeTableViewDemo
STRefresh
STRefresh.h 266B
github.png 2KB
STRefreshHeader.m 13KB
UIScrollView+STRefresh.m 578B
STRefreshHeader.h 507B
UIScrollView+STRefresh.h 300B
STTransition
STTransitions.h 415B
STTransitions.m 4KB
onepiece_kiudai.png 2.13MB
STView
CustomCollectionView.h 446B
CustomSegmentControl.m 3KB
CustomTableView.h 272B
CustomTableView.m 3KB
CustomSegmentControl.h 688B
CustomCollectionView.m 7KB
STController
STListController.h 224B
STListController.m 2KB
STViewController.h 669B
STImageController.m 1KB
STImageController.h 277B
STViewController.m 18KB
Assets.xcassets
AppIcon.appiconset
Contents.json 585B
main.m 336B
SwipeTableView
STCollectionView.h 6KB
SwipeTableView.h 5KB
STHeaderView.m 9KB
UIView+STFrame.h 720B
STCollectionView.m 23KB
UIView+STFrame.m 2KB
STHeaderView.h 1KB
SwipeTableView.m 37KB
AppDelegate.h 279B
AppDelegate.m 2KB
Base.lproj
LaunchScreen.storyboard 2KB
Main.storyboard 6KB
Info.plist 1KB
SwipeTableView.xcodeproj
project.xcworkspace
contents.xcworkspacedata 159B
xcuserdata
roylee.xcuserdatad
UserInterfaceState.xcuserstate 74KB
project.pbxproj 27KB
xcuserdata
roylee.xcuserdatad
xcschemes
xcschememanagement.plist 576B
SwipeTableView.xcscheme 4KB
xcdebugger
Breakpoints_v2.xcbkptlist 91B
SwipeTableViewTests
SwipeTableViewTests.m 922B
Info.plist 733B
License 1KB
ScreenShots
SwipeTableViewStruct1.png 346KB
SwipeTableViewStruct2.png 409KB
screenshot3.gif 2.73MB
screenshot1.gif 5.81MB
logo.png 425KB
screenshot2.gif 2.4MB
README.md 17KB
SwipeTableView.podspec 2KB
共 54 条
- 1
资源评论
d350078162
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功