代码之家  ›  专栏  ›  技术社区  ›  trevorsm

嵌套的uiScrollView同时滚动

  •  6
  • trevorsm  · 技术社区  · 14 年前

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

    我目前的解决方案包括隔离垂直滚动视图的手势并将其委托给我的视图控制器:

    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;
    }
    

    这个解决方案基本上是可行的,但是当我拖动视图时,它偶尔会出现问题,特别是当我用鼠标快速移动视图或拖动它超过视图边界时。具体地说,其中一个滚动视图将临时跳转回它开始的位置,就好像那个手势被取消了一样,但如果我继续滚动,它将跳转回原来的位置。

    我想知道的是,是否有一种更简单或更可靠的方法来实现我忽略了的这种滚动,或者是否有什么我可以做的来消除浮华的行为。

    2 回复  |  直到 12 年前
        1
  •  3
  •   trevorsm    14 年前

    当视图被拖出内容区域、释放,然后在滚动视图反弹之前再次点击/拖动时,会发生异常行为。例如,当视图被几次小的滑动滚动时,就会发生这种情况。其中一个滚动视图会被混淆,并尝试在拖动的同时减速(弹跳),导致它在原点和被拖动到的位置之间来回抖动。

    我可以通过反转滚动视图的嵌套(垂直滚动视图内部的页面视图)以及将代理添加到页面视图的uipangesturerecognizer而不是滚动视图的手势来解决这个问题。现在它自然地滚动,就好像它是一个单一的滚动视图,同时仍然只符合水平方向的分页。我不认为它是为了让滚动视图像这样同时进行滚动,所以我不确定最初的错误行为是由错误引起的,还是由于做了一些意外的事情而引起的。

        2
  •  2
  •   Community CDub    8 年前

    正如所指出的:“uiscrollview的内置pan-gesture recognizer必须将其滚动视图作为其代理。” Rythmic Fistman 上面。

    找到了解决办法…首先将内部uiscrollView子类化,并将其作为

    那么,您在实现中所要做的就是:

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

    似乎工作得很好。