融媒体滑动

融媒体滑动属于多层UIScrollView 嵌套滚动,超过2层的UIScrollView 嵌套滚动是很复杂的。

常见的解决方案

1、控制 isScrollEnabled 属性



  通过scrollView.contentOffset.y与临界值进行对比从而修改两者scrollView的isScrollEnabled属性值来达到目的。
缺点:滑动到临界值会使滚动中断,需要二次滑动才会切换scrollView。这种在交互上是难以接受。

2、自定义滑动手势



通过自定义实现滑动手势。

缺点:滑动手势的复杂多样,很难处理的和系统一样。因为是自定义手势,所以很多细节需要自己去处理。

3、手势穿透 (本文滑动方案 )



  首先通过手势穿透,实现双层scrollView的同时滚动。接着通过标志位(临界值)来控制何时允许底层的scrollView滚动,以及何时允许上层的scrollView滚动。
注:何时允许哪一层scrollView能滚动,并不是说另外一层scrollView就不能滚动,而是给另外一层scrollView设置了固定的偏移量来达到不能滚动的效果

滑动展示效果及页面结构




一.具体方案

1.手势冲突问题



  其实嵌套最大的问题就是手势冲突问题,上层的ScrollView会拦截手势,导致手指在上层ScrollView滑动的时候,下层ScrollView不动。所以我们首先要让手势冲突时,两个手势都去响应。这样,我们滑动的时候,两个scrollView都会滑动。

上层tableView不拦截手势

2.频繁正反向传值问题



  上下两层scrollView滑动时候都需要对方的offset来计算,所以我们创建一个上下文对象,让两个scrollView都持有,避免了频繁正反向传值的问题。

创建上下文对象

3.滑动的时候计算滑动优先级


下层scrollView的contentOffset变化时计算

上层tableView的contentOffset变化时计算

4.设置下层scrollView的边界属性


1
2
bounces = false
bouncesZoom = false


5.滚动中断问题


  此时当下层scrollView偏移量y=0,上层tableView偏移量y=0时,滚动中断,需要二次滑动才会切换tableView。


解决办法:在下层scrollView上添加一个尺寸与上层tableView尺寸大小一致的滑动视图。把上层tableView包裹其中。此滑动问题解决。