iOS 嵌套UIScrollview的滑动冲突另一种解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 嵌套UIScrollview的滑动冲突另一种解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 这篇文章主要是看了 卓同学的嵌套UIScrollview的滑动冲突解决方案 之后,我想换一种方式来实现,其实基本思想是一样的。

先说说整体结构:
一个 mainScrollView 上面有一个 bannerView 和 subScrollView , subScrollView 上面有三个 tableView ,基本就是微博个人主页的那种结构

基本思路:
mainScrollView 的 scrollEnabled 设为 NO
subScrollView 的 scrollEnabled 设为 YES (最开始也设为NO了,但是page的实现没有想到好的方法)
tableView 的 scrollEnabled 设为 NO
在 self.view 上添加 UIPanGestureRecognizer 手势
这里我们还要用到 UIDynamicAnimator 添加惯性 & 弹性动画

这样实际上 Pan 手势和 subScrollView 上的手势会冲突,但是由于两个手势控制的方向是不一样的, Pan 手势只控制垂直方向,而 subScrollView 上的手势控制水平方向,根据方向我们就可以解决手势冲突

关于 Pan 手势在 UIGestureRecognizerStateChanged 中我们获取到的是距离上一次移动的距离,因为我们每次方法结束时设置 [recognizer setTranslation:CGPointZero inView:self.view] ,获取距离方便我们来设置 contentOffset

我们在移动手势的时候改变 contentOffset ,还是根据关键点来判断是当前 tableview 滚动还是 mainScrollView 滚动,当手势结束之后我们添加惯性动画,使用 UIDynamicItemBehavior 来添加一个线速度,这个线速度就是手势的滑动速度

contentOffset 的设置

这里弹性动画主要是靠当 UIAttachmentBehavior ,当 mainScrollView.contentOffset.y < 0 时我们就移动 mainScrollView.frame ,超过最大限度同理,这样的写法主要是为了实现弹性动画。

添加这两个动画之后基本上感到平顺很多

Demo在这里
参考
1.用UIKit Dynamics模仿UIScrollView
2.自定义UIScrollView

以上是关于iOS 嵌套UIScrollview的滑动冲突另一种解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Android 解决viewPager中嵌套webView的滑动冲突

UIScrollView嵌套TableView手势冲突问题

iOS-UIScrollView滑动与手势冲突

ViewPager2 TabLayout Fragment RecyclerView滑动冲突

Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突

解决右滑返回手势和UIScrollView中的手势冲突