在 UIButton 下添加 UIScrollView 后失去点击识别

Losing tap recognition after adding a UIScrollView under a UIButton

我有两个相邻的 UIScrollView,它们都被带有点击手势识别器的 UIButton 部分覆盖。它们按以下顺序添加到视图中:

  1. 滚动视图 #1
  2. 按钮
  3. 滚动视图 #2(由用户交互添加)

按钮的两个滚动视图都是 "behind" z 定位的,但是按钮在与较新的滚动视图重叠的地方不会收到点击。

有什么方法可以申报 "keep this button the topmost receiver of taps"?

编辑:下面是视图的模型。按钮的红色部分是添加scrollview 2后停止接受点击的区域

不用写很多代码我给你一个解决方案

我相信您的视图层次结构是这样的:(z-index 已排序)

superview
    scrollview1
    scrollview2
    button

虽然您的按钮位于滚动条上方,但与滚动视图共享相同的超级视图...而不是这样做,将按钮和滚动视图分开在不同的容器中怎么样?

superview
    scroll_container
        scrollview1
        scrollview2
    button

而且,如果 UIButton 已经有手势识别器,为什么还要附加它?您只需要使用以下方法将选择器添加到按钮:

[button addTarget:yourObject action:@selector(yourMethod:) forControlEvents:UIControlEventTouchUpInside];

可能是你的按钮有问题,而不是 z-index ...

两种都试试,然后告诉我们结果。

我建议按钮没有正确放置在右滚动视图上方。我知道您已经设置了 zPosition,但是您应该尝试使用以下方法将按钮放在前面(并将两个滚动视图发送到后面):

[self.view bringSubviewToFront:button]; [self.view sendSubviewToBack:scrollView1]; [self.view sendSubviewToBack:scrollView2];

如果按钮位于视图排序的顶部,它应该首先接收触摸事件。

否则,可能是 UIScrollView 的手势识别器与 UIButton 的手势识别器发生冲突。尝试实现以下内容以确保其背后的 UIButton 和 UIScrollView 都从它们的手势识别器接收触摸事件:

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

上述 UIGestureRecognizerDelegate 方法的默认 return 值为 NO,这可以解释为什么按钮没有接收到触摸事件。您可以查看有关此方法和其他委托方法的更多信息 here

这应确保所有手势识别器都在其视图中识别触摸。

希望对您有所帮助!