如何禁用UIScrollView的特定子视图中的滚动

时间:2014-11-24 08:37:29

标签: ios objective-c uiscrollview uipangesturerecognizer

我有UIScrollView,其中包含许多子视图。其中一个子视图旨在显示折线图,因此用户可能需要水平拖动。事实上,当我的意思是水平拖动手指时,UIScrollView的垂直滚动很容易激活。现在我想在图表的子视图中禁用垂直滚动,并将其保留在其余部分中。

我尝试在我的图表子视图中添加UIPanGestureRecognizer。它确实禁用了垂直滚动,但水平滚动也被禁用。我知道我可以在手势识别器的处理程序中编写代码来告诉我需要的垂直或水平滚动。但水平滚动实际上是由子视图的控制器管理的,该控制器是第三方库(JBChartView是特定的)。我想知道是否有一种简单的方法来解决这个问题。

非常感谢。

3 个答案:

答案 0 :(得分:4)

感谢Dev和Astoria,我已经解决了这个问题。现在我想在这里发布我的解决方案,以防有人遇到与我相同的问题。

结果如下:

Final Result

因为Horizo​​ntal Only View不是scrollView(实际上它是JBLineChartView),所以最简单的scrollViewDidScroll方式并没有帮助。

我们仍然需要GestureRecognizer来实现这一目标,但是以更基本的方式,就像Dev所说,-touchesBegan方法。可悲的是,UIScrollView不会响应这种触摸,我们需要为它编写一个类别,如下面的代码所示:

@implementation UIScrollView (UITouchEvent)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self nextResponder] touchesBegan:touches withEvent:event];
    [super touchesBegan:touches withEvent:event];
    self.scrollEnabled = YES;//This is the only line that you need to customize
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self nextResponder] touchesMoved:touches withEvent:event];
    [super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self nextResponder] touchesEnded:touches withEvent:event];
    [super touchesEnded:touches withEvent:event];
}
@end
哈,那它有效!

BTW ....这是我在StackOverflow上的第一个问题,这是一次非常好的旅行。

答案 1 :(得分:3)

使用-touchesBegan的UIResponder类。如果触摸来自您的子视图(您不想滚动)。禁用滚动视图的滚动。 如果为该视图调用-touchesEnded或-touchesCancelled。启用滚动滚动视图。

答案 2 :(得分:3)

如果我没有弄错,你的主滚动视图包含另一个滚动视图,它是折线图的父级。在这种情况下,您可以使用UIScrollViewDelegate协议方法。只需在开始滚动子视图时禁用主滚动视图。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
  if(scrollView==self.lineChartParent)
    self.mainScrollView.scrollingEnabled = NO;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
  if(scrollView==self.lineChartParent)
    self.mainScrollView.scrollingEnabled = YES;
}