2010-10-12 39 views
6

我有两个嵌套的UIScrollViews:父级限于水平分页,孩子限于垂直滚动。内容是一个可以自由拖拽的大视图,但会捕捉到三个水平部分之一。嵌套滚动视图的默认行为是只允许一次向一个方向滚动,但我希望允许同时拖动两个方向以保持操纵单个大视图的感觉。嵌套的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; 
} 

该解决方案主要是作品,但它偶尔会充当出问题,当我拖动周围景观,尤其是当我用鼠标周围快速移动,或拖动它周围的过去视图范围。具体来说,其中一个滚动视图会暂时跳回到开始位置,就好像该手势已被取消一样,但如果我继续滚动,则会跳回。

我想知道的是,如果有一种更简单或更可靠的方法来实现像我一样忽略的滚动,或者如果有什么我可以做,以消除这种不良行为。

+0

我已经做了类似的事情,我想你,它的作品完美。你是否试图基本上有一个大面积滚动左右不断地有顶部和左侧区域告诉用户他们在哪里? – Rudiger 2010-10-12 22:00:01

+0

不完全;我所展示的是一款MMO游戏中的三种天赋树。我不想将每棵树当作一个独立的页面,而是希望允许自由地拖动视图,但是在释放拖动时让它锁定在其中一棵树上。我见过其他使用类似行为的应用,特别是显示该游戏天赋树的WoW Armory应用。 – trevorsm 2010-10-12 23:03:11

+0

好的,小姐理解,如果我想到一些东西,我会稍后回顾 – Rudiger 2010-10-12 23:30:57

回答

3

当视图被拖出内容区域,释放,然后在滚动视图反弹之前再次轻敲/拖动视图时,发生了一些令人不快的行为。例如,当视图通过几次小滑动滚动时,可能会发生这种情况。其中一个滚动视图会变得混乱,并尝试在被拖动的同时减速(反弹),导致它在原点和被拖动到的位置之间来回抖动。

我能够通过反转滚动视图的嵌套(垂直滚动视图内的分页视图)并将代理添加到分页视图的UIPanGestureRecognizer而不是滚动视图的手势来解决此问题。现在它自然滚动,就好像它是一个单一的滚动视图,同时仍然符合仅在水平方向上的分页。我不认为这是为了让滚动视图像这样被同时滚动滚动,所以我不确定最初的错误行为是由于错误导致的,还是仅仅是由于做非预期的事情造成的。

2

刚刚一直在为此努力,并且因'NSInvalidArgumentException'撞墙,原因是:'UIScrollView的内置平移手势识别器必须将其滚动视图作为它的委托。正如上面的Rythmic Fistman所指出的那样。

找到办法解决它......第一子类内的UIScrollView,并使其作为

然后你在贯彻做的是:

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

看起来工作得很好。

+0

使它成为......什么? – 2017-05-25 18:40:36

+0

我几乎不知道:D – 2017-05-25 19:55:14