关于 iOS 手势交互的一个问题,问了一圈居然无人能解,难道在 iOS 上实现这个手势交互是个无解的难题?

2018-04-19 08:28:19 +08:00
 forkon

[前提] scrollViewA 和 scrollViewB 在同一个父视图里面,不嵌套,且 scrollViewA 在 scrollViewB 的之上。

[要实现的交互] 手指先是在 scrollViewA 里面向上滑动,当 scrollViewA 滚动到最底下时,scrollViewB 接着滚动,这个过程中手指从未抬起(相当于 touch 事件从 scrollViewA 传到了 scrollViewB ?)。

+-----------------------------------+ | | | | | | | | | | ^ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | scrollViewA | | | | | + | | | | | | | +---------------------------+ | | | | | | | | scrollViewB | | | | | +-----------------------------------+

11719 次点击
所在节点    iDev
60 条回复
whileFalse
2018-04-19 08:59:48 +08:00
不懂 iOS,但曾经是个前端。
scrollViewA 能不能捕获滑动事件?捕获之后发现自己滚到头了,就向 scrollViewB 派发滑动事件即可。
sea516
2018-04-19 09:08:06 +08:00
初学者吧
forkon
2018-04-19 09:16:35 +08:00
@sea516 莫非你知道答案,请不吝赐教。

@whileFalse 没那么简单。
mcluyu
2018-04-19 09:27:09 +08:00
1.A 在上 B 在下, 向上滑怎么还会滑到 B ?我理解有问题?要不你画个图表示一下。。
2.你手放在 A 上滑不抬起,触摸事件怎么会自己跑到 B 上面呢,区分一个触摸事件的触摸范围自然是从第一次触摸时算起,要是范围在不抬起(不改变初始触摸范围)的情况下自己变了才是有问题吧?比如不小心滑动到一个按钮上面,那是不是要算点击了该按钮呢?
3.为什么会有这么奇怪的需求,A 滑动到底部时 B 继续,那用一个 ScrollView 不就行了吗?
3a3Mp112
2018-04-19 09:29:34 +08:00
scrollViewA 生成 delegate, 当 B 到达底部的时候, 给 A 的代理发消息,做你想要做的动作。
elgae
2018-04-19 09:31:26 +08:00
可以做的,有个关于手势的文档,读了就明白了
elgae
2018-04-19 09:34:57 +08:00
@elgae 我错了
fadaixiaohai
2018-04-19 09:35:02 +08:00
看不懂,向上滑还会滑到屏幕最底下?什么操作?
你最好理解一下滑动的本质是什么?了解一下怎么用 layout 来做视图的滑动。
C90
2018-04-19 09:37:50 +08:00
hitTest 了解一下
sunhr
2018-04-19 09:40:21 +08:00
你可以把两个 scrollView 的 scrollEnabled 都禁掉,然后在 superview 上加一个 UIPanGestureRecognizer,自己通过这个手势去计算设置两个 scrollView 的 contentOffset
itenyh
2018-04-19 09:43:10 +08:00
@forkon 我试了一下,基本实现了你的需求,等下空了发上来,不过有点绕。感觉 @sea516 有更简单的办法。
zvving
2018-04-19 09:44:06 +08:00
拆分的目的是什么,想达到什么效果?为什么不用一个 scroll view 解决?
dcty
2018-04-19 09:47:56 +08:00
UITableview
>CellOne ( firstScrollView )
>CellTwo ( secondScrollview )

cellHeight equalTo Scrollview ContentHeight

这个是能满足需求的,并且从扩展性和性能上来说,也不至于有特别大的问题

如果说你担心的是复用问题,或者懒加载问题,那么则应该想办法用 TableView 或者 collectionview 来解决
另外多个 Scrollview 嵌套是官方不推荐的,当然我们也实现过,能实现,从技术的角度出发,实现有点戳,并且不是特别优,从用户体验的角度出发,没毛病。

楼上的人也有提到过,你这个需求如果不是为了扩展性,一个 Scrollview 就解决了啊。
forkon
2018-04-19 09:50:00 +08:00
@mcluyu 很用心的回复,多谢……需求就是这么奇葩,而且还不能只用一个 ScrollView。
@3a3Mp112 可以通过这种方法改变 B 的 contentOffset,但手指抬起之后 B 没有一个减速停止的过程。
@elgae 哪个文档
tigerZhang
2018-04-19 09:53:17 +08:00
同意楼上的观点。
itenyh
2018-04-19 09:55:18 +08:00
懒得写了,简单说一下核心思想:和 @sunhr 实质是一样的。 首先 superview 是一个 scrollview (简称 C ),superview 上摆放你的 scrollviewA ( A ), scrollviewB ( B ):
1. AB 把 C 完全遮住
2. AB userInteractionEnabled = NO
3. C 的 contentsize 的 height (如果你是垂直滑动)等于 AB 的 contentsize 的 height 之和。
好了,现在你滑动手势并不会让 AB 移动,而是让 C 移动,不过你看不到。这样,你可以通过 C 的 contentoffset 的变化来操纵 AB 的 contentoffset 的变化了。
核心思路是这样,还有些细节,慢慢搞吧。
sunhr
2018-04-19 10:02:05 +08:00
@itenyh

兄弟,你这个肯定是不行的~

1、如果 C 是 scrollView 的话,AB 会跟着滚动的

2、userInteractionEnabled = NO 的话,如果 AB 需要接受 touch 事件就杯具了呐,应该是 scrollEnabled = NO
itenyh
2018-04-19 10:05:23 +08:00
@sunhr 第一点经我试验,AB 肯定是不会跟随的。 第二点如果 AB 需要接受 touch 事件就杯具了,这特么确实是个悲剧!看看有没有办法改进。
snail1988
2018-04-19 10:08:19 +08:00
@forkon 两个方案都很简单 1 上面 scrollview 放在下面大 scrollview 上,自己实现 UIGestureRecognizerDelegate 允许两个 scrollview 同时相应手势,然后家逻辑判断哪个 scrollview 不能动即可
snail1988
2018-04-19 10:09:33 +08:00
@forkon 第二个方案 上层覆盖透明 scrollview 把 offset 实时同步给下面两个 scrollview
建议第一个 很简单 自己实现 pan 手势代理即可

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/448015

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX