同时滚动嵌套的UIScrollViews

7

我有两个嵌套的UIScrollViews:父视图被限制为水平分页,子视图被限制为垂直滚动。内容是一个大视图,可以自由拖动,但会捕捉到三个水平部分之一。嵌套滚动视图的默认行为是一次只允许在一个方向上滚动,但我想允许同时在两个方向上拖动,以保持操纵单个大视图的感觉。

我的解决方案涉及隔离垂直滚动视图的手势,并将其代理设置为我的视图控制器:

for (UIGestureRecognizer *gesture in scrollView.gestureRecognizers)
    if ([gesture isKindOfClass:[UIPanGestureRecognizer class]])
        gesture.delegate = self;

然后,我实现了委托方法,使分页视图的手势能够与滚动视图的平移手势同时识别:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if (gestureRecognizer.view == scrollView && otherGestureRecognizer.view == pageView)
        return YES; // allow simultaneous scrolling of pageView and scrollView

    return NO;
}
这个解决方案大部分情况下是有效的,但当我拖动视图时,特别是用鼠标快速移动或将其拖动超出视图范围时,它偶尔会出现故障。具体来说,其中一个滚动视图会暂时跳回到起始位置,就好像该手势已被取消一样,但如果我继续滚动,它会再次跳回。 我想知道的是是否有更简单或更可靠的方法来实现这样的滚动,或者是否有任何可以消除故障行为的方法。

我做过类似的事情,我认为它完美地运作。你是想基本上拥有一个大区域来滚动,而顶部和左侧区域始终告诉用户他们所在的位置吗? - Rudiger
并不完全是;我展示的是一个MMO游戏中某个职业的三种天赋树。与其将每个树视为独立页面,我想允许自由拖动视图,但在释放拖动时锁定其中一棵树。我见过其他应用程序使用类似的行为,特别是WoW装备库应用程序显示该游戏的天赋树。 - trevorsm
啊,好的,误解了,如果我想到什么,稍后再回头看看。 - Rudiger
'NSInvalidArgumentException',原因:'UIScrollView 的内置拖动手势识别器必须将其滚动视图设置为代理。' 真可惜。 - Rhythmic Fistman
@RhythmicFistman,你解决了委托问题吗?我也遇到了同样的问题... - Georg
我没有这样做。看起来你不能干扰UIScrollView的平移手势识别器。 - Rhythmic Fistman
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
当视图被拖出内容区域、释放并在回弹之前再次被点击/拖动时,会发生故障。例如,当视图被多次小滑动滚动时,其中一个滚动视图会变得混乱,并尝试在同时被拖动的情况下减速(反弹),导致它在原点和被拖到的位置之间来回抖动。 通过改变滚动视图的嵌套方式(将分页视图放在垂直滚动视图内部)并将委托添加到分页视图的UIPanGestureRecognizer而不是滚动视图的手势上,我成功解决了这个问题。现在,它可以像单个滚动视图一样自然滚动,同时仍然只能在水平方向上进行分页。我认为滚动视图被欺骗成同时滚动并不是预期的行为,因此我不确定原始的故障行为是bug的结果,还是做了一些意外的事情所导致的。

2

我也遇到了同样的问题,并且被 'NSInvalidArgumentException' 打击了一下,原因是:“UIScrollView 的内置滚动手势识别器必须将其滚动视图作为其委托”。正如上面 Rythmic Fistman 所指出的。

找到了一个解决方法...首先子类化内部 UIScrollView 并将其设置为

然后在实现中所需做的就是:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}

看起来工作正常。


做成什么? - Andrew Paul Simmons
2
我真的一点都不知道 :D - Will Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,