基本原理
给slidePopupView添加一个滑动手势
并设置代理
我们在 shouldReceiveTouch 代理方法中 通过 touch.view 判断 是否是滑动tableView, 如果
touch.view 是tableView , isDragScrollView 就是YES, 否则就是NO
并且要 shouldRecognizeSimultaneouslyWithGestureRecognizer 方法中 gestureRecognizer == self.panGesture
[otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer] 的情况下返回YES,因为这个时候
我们手在滑动tableView的时候,也会响应 slidePopupView 的 手势方法,这样的话,我们在向下滑动tableView 滑动到顶部的时候,
可以直接无缝衔接的修改slidePopupView 的frame, 这样达到连续滑动的效果,否则我们滑动tableView 到顶部之后,九不能带动slidePopupView
滑动了,当然这个衔接需要我们自己处理 ,后面会讲到
我们在滑动手势的响应方法中 handlePanGesture ,如果 isDragScrollView = NO,就直接修改
slidePopupView的frame, 跟着pangesture的偏移量移动 如果
isDragScrollView = YES, 这个时候其实tableView的滑动不需要我们处理,就是处理正在滑动tableView的时候需要滑动slidePopupView frame 情况
其实有两个临界情况,一个是比较容易出现的情况就是我们向下滑动 评论视图滚动到顶部并继续向下滑动,这个时候,我们需要处理,让tableview不能滚动,并且去修改
slidePopupView的frame 让整个弹窗向下滚动 , 另外一种情况就是比较不同意出现的,但是我们为了代码健壮要有这种逻辑, 我们向下滑动弹窗头部(不在tableView)范围内,使评论弹窗向下滑动适当的偏移量 , 然后我们将手的触摸点放在tableview范围内,向上滑动,这个时候,需要我们修改slidePopupView的frame达到滑动的效果。
总的来说,就是我们先判断,触摸点是否是在tableview中,如果不的话,是容易处理的,直接修改slidePopupView 的frame就行了,如果是在tableview范围内的,
就要判断如何处理滑动了,因为,系统默认情况下,是只滑动tableView的,我们需要处理的就是触摸点在tableview 范围内的时候,不滑动tableView ,而是要滑动
slidePopupView.其实就两种情况
一种translationOffset < 0 并且 slidePopupView.top 没有到达最高点的时候,需要我们滚动向上slidePopupView,
一中是 translationOffset > 0 并且 tableView.offset = 0的时候,需要我们向下滚动 slidePopupView
注意事项
注意这个滑动手势,不是tableView本身自带的滑动手势,
tabelView本身的滑动时系统处理的,我们这里要处理的是我们添加到slidePopupView 的滑动手势,但是触摸点在tableView范围内的情况。这个时候,要分情况进行处理
我们通过translationInView 获取到滑动手势的偏移量, 如果 translationOffset < 0,则说明
是在向上滚动, 这个情况下又分两种情况,我们 slidePopupView 有一个最大高度,则slidePopupView 距离
屏幕顶部有一个最小距离, 如果slidePopupView 的top 大于最小距离,则 向上滑动的时候,tabelView 是不动的,
并且要将tableView的偏移量置为0,因为只有在popupslideView到达最大高度的时候在允许tableview向上滚动
并且设置 self.scrollView.panGestureRecognizer.enabled = NO, 避免手势向上滑动的时候,两层视图同时滚动,
并且要修改 isDragScrollView = NO 并执行修改 popupslideView frame的方方法updateContentFrame, 如果 slidePopupViewtop =slidePopupView 到顶部的最小距离了,我们就不做处理,让系统自动处理滚动tableView