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

时间:2015-04-27 04:06:02

标签: ios uiscrollview uibutton uikit uitapgesturerecognizer

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

  1. Scrollview#1
  2. 按钮
  3. Scrollview#2(通过用户互动添加)
  4. 两个滚动视图都是z定位"后面"按钮,但按钮不会接收与较新的滚动视图重叠的点击。

    有没有办法可以声明"让这个按钮成为水龙头最顶级的接收器"?

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

    mockup of all views

2 个答案:

答案 0 :(得分:1)

我建议按钮没有正确放置在右侧滚动视图上方。我知道您已经设置了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方法的默认返回值为NO,这可以解释为什么按钮没有接收到触摸事件。您可以查看有关此方法和其他委托方法here的更多信息。

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

希望这有帮助!

答案 1 :(得分:0)

我会在没有编写大量代码的情况下为您提供解决方案。

我相信你的视图层次结构是这样的:( z-index ordered)

superview
    scrollview1
    scrollview2
    button

你的按钮虽然位于卷轴上方,但是与滚动视图共享相同的超级视图...而不是这样做,如何将按钮和滚动视图分开放在另一个容器上?

superview
    scroll_container
        scrollview1
        scrollview2
    button

而且,为什么你要把手势识别器附加到UIButton上?您只需使用以下选项将选择器添加到按钮:

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

也许这是你按钮的问题,而不是z-index ......

尝试两种方式,让我们知道结果。