使用按钮检测水平滚动 UIScrollView 上的垂直滚动

Posted

技术标签:

【中文标题】使用按钮检测水平滚动 UIScrollView 上的垂直滚动【英文标题】:Detecting vertical scroll over horizontally scrolling UIScrollView with buttons 【发布时间】:2011-02-12 16:25:47 【问题描述】:

我有一个水平滚动的 UIScrollView。我还让我自己的处理程序在垂直滚动上做一些不同的事情。这确实很好用,但是我使用以下代码在 UIScrollView 上添加了一些按钮:

UIButton *catButton = [UIButton buttonWithType:UIButtonTypeCustom];
[catButton addTarget:self action:@selector(clickCatButton:) forControlEvents: UIControlEventTouchUpInside];

按钮的动作在点击时被调用:

- (void) clickCatButton:(id) sender 

   [NSObject cancelPreviousPerformRequestsWithTarget:self];

但我的问题是,由于将按钮放在 UIScrollView 上,它们接管了管理垂直滚动的代码。

我有点不知道解决这个问题的最佳方法是什么。

感谢您的帮助

【问题讨论】:

【参考方案1】:

如果您真的想处理垂直滚动,即使在按钮上发生拖动,您可能会做的是将 UIButton 子类化并将触摸事件转发给下一个响应者(在本例中是滚动视图)。在您的 UIButton 子类中,重写事件处理方法(touchesBegan...等)以调用超类实现(UIButton's),然后将事件转发给下一个响应者,例如:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event   
    [super touchesBegan:touches withEvent:event];
    [self.nextResponder touchesBegan:touches withEvent:event]; 

但是要小心并考虑当按钮的事件处理和您对垂直滚动的处理同时发生时可能发生的所有情况。例如,如果拖动穿过一个按钮(好吧,尽管如果垂直滚动正常工作就不会发生),那么该按钮认为它是对按钮的有效“按下”,它将触发一个动作消息。

【讨论】:

以上是关于使用按钮检测水平滚动 UIScrollView 上的垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 内的水平 UIStackView 不滚动

UIScrollView 检测滚动

UIScrollView 不能水平滚动

在 iOS 7 中使用 UIScrollView 在 iOS 中创建水平滚动 UIButton

检测用户何时中断 UIScrollView 动画

如何检测scrollView的滚动方向?