效果
首先分析下这个界面的构成。
这个界面总共由三个TableView构成,最外层一个TableView,两个栏目分别对应两个TableView。
基本解决思路
监听最外层TableView滑动事件,滑动时判断是外层TableView滑动,还是内部TableView
滑动
代码解释:默认情况下gestureRecognizer会返回false,表示手势有冲突时,忽略自己的事件,在这个场景下,可以简化认为是否处理滑动事件(因为滑动时内部TableView时,外部TableView和内部TableView包括其他的View都会引发这个事件,如果默认返回false,事件将会被丢失)。
实现方法的类,作为最层TableView,其中allowGestureEventPassViews的otherGestureRecognizer就是内部的TableView,这样就能保证在事件冲突时,事件依然能被传递和处理。
解决方案
自定义两个基类,包裹住内部TableView和外部TableView,两个TableView同时响应滚动事件,在响应事件中,判断哪个TableView应该滚动
外部容器关键代码
内部容器关键代码
外部容器保存了外部TableView。
内容容器保存内部的TableView,同时也保存了外部的TableView
滚动时,内部和外部的都会调用tableViewDidScroll方法,在内外的tableViewDidScroll中判断应该由TableView滚动。
模块的使用
外部的TableView的cell 是CAPSPageMenu(拥有两个TableView的ViewController),滚动时调用外部容器的tableViewDidScroll。
内部的TableView滚动时,调用内部TableView的tableViewDidScroll
总结
外部的TableView处理手势冲突,使用时,内外的的滚动都交由内外容器去处理,在容器中判断由哪个TableView滚动
实际代码位置
common/view/BaseNestTableView