iOS UIScrollView滚动时取消UIButton触摸事件

7

我在UIScrollView中放置了一些UIButtons,但是我不想延迟按钮点击。然而,一旦滚动视图检测到拖动/滚动,我希望取消UIButton的点击并继续进行UIScrollView的滚动。

我已经包含了以下内容...

_scrollView.delaysContentTouches = NO;

...但是(显然)当拖动时,按钮触摸并不会被取消。请问有没有人对如何实现这个功能有建议?

2个回答

12

您可以重写UIScrollView的此方法。

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{   
    return YES;
}

在您的UIButton中,您应该为不同的控制事件添加不同的方法。

  1. 对于UIControlEventTouchDown,应该显示高亮效果。
  2. 对于UIControlEventTouchUpInside | UIControlEventTouchUpOutside,应该触发按钮;
  3. 对于UIControlEventTouchCancel,应该清除高亮效果。

1
这是期望的解决方案。谢谢。 - lucien
UIControlEventTouchCancel 是我缺少的一个通知,它起作用了。谢谢! - Christian Gossain

1
您可以使用scrollViewWillBeginDragging触发通知,并通过在按钮代码中监听来处理按钮取消。我认为这就是您要做的,但我不确定我是否正确理解了您的问题。

感谢您的反馈。我尝试了scrollViewWillBeginDragging,但如果在滚动之前点击按钮,它不会触发。我的目标是点击按钮时没有延迟。然后,如果您在手指仍按下的情况下移动手指,则取消按钮并开始滚动。 - lucien
尝试在iOS主屏幕上这样操作...点击一个应用程序,你会注意到它变暗了,但是一旦你拖动手指,它就会取消触摸并滚动。 - lucien
所以你想让按钮立即触发一个动作,但当滚动视图被拖动取消时呢?而且一旦你按下一个按钮,然后拖动,scrollViewWillBeginDragging就不会被调用了?这在主屏幕上是个很好的例子。 - Psiticosis
scrollViewDidScroll会被调用吗? - Psiticosis
scrollViewDidScroll也没有被调用。一旦你点击一个按钮,如果你拖动手指,它仍然认为你在点击按钮,直到你的手指离按钮相当远(标准UIButton行为)才会取消。 - lucien

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