先放个代码链接
(微博模式):https://github.com/qussers/IZJHorizontalTableView
(闲鱼模式):https://github.com/qussers/IZJVerticalHrizontalView
这类APP普遍满足多个或全部特点:
1、存在一个头部视图,或者说垂直滑动的视图。
2、在垂直滑动的视图下方,一般还有个停驻的视图。
3、在停驻视图下方,存在水平切换的多个视图。
4、水平切换的视图中,包含垂直滑动视图。并且垂直的滑动能联动头部视图的滑动。
5、头部视图的响应链本身完整。
6、整体的垂直滑动能够丝滑,并且有弹簧效果。
微博的效果和闲鱼或者转转等二手交易平台的滑动效果不同点在于,微博的头部滑动止于停驻视图,而类似闲鱼的这种,贯穿整个视图。两种效果的实现方案各不相同,下面分开说。
第一种:继承自UITableVIew
适用情况: 垂直方向有大量视图需要加载,列表比较长,自定义性能要求高。
层级结构:
0:UITableView
1: TableVIew的Footer添加CollectionView
2: CollectionView添加横向滑动的ScrollView
要点:
通过重写
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer ;
达到底层TableView能够相应上层滑动的效果。
为了优化体验,对水平和垂直加速度进行判断,规避双方向滑动。
通过监听各自ContentOffset从而控制各层ScrollView联动。
第二种:继承自UIView
适用情况:垂直headerVIew比较轻量,多类似头部视图高度较小。
层级结构:
0:UIView
1:UIView->UICollectionView
2: UICollectionView->ScrollView
3: ScrollView-> HeaderView
要点:
横向滑动时,偷梁换柱, 数据源传入ScrollView,并设置ContentInset, 将HeaderView从ScrollView上转移添加到UIView上,横向滑动结束后,再切换到ScrollView。头部视图添加一个父视图(这里我用了一个ScrollView稍稍扩大了下contentSize的宽度),接收横向滑动响应链条,从而阻断下层的横向滑动响应。
、
更一般的自定义效果如: