【问题标题】:Losing tap recognition after adding a UIScrollView under a UIButton在 UIButton 下添加 UIScrollView 后失去点击识别
【发布时间】:2015-04-27 04:06:01
【问题描述】:

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

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

两个滚动视图都位于按钮“后面”的 z 轴位置,但按钮在与较新滚动视图重叠的位置不接收点击。

有没有办法可以声明“让这个按钮成为最顶端的点击接收器”?

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

【问题讨论】:

  • 我不明白点击手势识别器在哪里出现 - 请您详细说明一下?为什么需要这个?
  • 您是否明确将 z 位置设置在按钮后面,或者您是否只是假设是因为您可以看到按钮高于其他所有内容?
  • @JohnRogers 添加目标选择器并没有提供我需要的功能,所以我添加了一个手势识别器 - 我需要接收按钮上的点击和拖动。
  • @Schemetrical 是的,滚动视图的 z 位置均为 20,按钮的 z 位置为 40。
  • @JohnRogers 另外,我尝试将手势识别器替换为简单的目标选择器,但同样存在无法触发的问题。

标签: ios uiscrollview uibutton uikit uitapgesturerecognizer


【解决方案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

这应该确保所有手势识别器都在他们的视图中识别触摸。

希望这会有所帮助!

【讨论】:

  • 感谢您的帮助!我尝试了bringSubviewToFront 等方法,不幸的是它们不起作用。至于覆盖gestureRecognizer 方法,我无法做到——UIGestureRecognizerDelegate 允许我访问的唯一方法是gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool。但是,我尝试删除按钮并在添加第二个滚动视图时立即重新添加它。这是一个丑陋的黑客,但它有效!
  • 真的吗?如果您能够实现gestureRecognizerShouldBegin,您应该能够实现该方法。 Swift 声明是gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool
  • 从头开始 - 我误解了如何访问它。我能够实现它并返回 true,但它并没有解决问题。
  • 这很奇怪。如果不能自己调试程序,很难说。在添加第二个 UIScrollView 之后添加按钮将意味着它被带到前面(这是 bringSubviewToFront: 应该做的......)。
  • 不客气。如果它对您有所帮助,请不要忘记接受答案。祝你好运,玩得开心!
【解决方案2】:

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

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

superview
    scrollview1
    scrollview2
    button

您的按钮虽然位于滚动条上方,但与滚动条共享相同的超级视图...与其这样做,不如将按钮和滚动条放在不同的容器上?

superview
    scroll_container
        scrollview1
        scrollview2
    button

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

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

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

两个都试一下,然后告诉我们结果。

【讨论】:

  • 我在按钮上有一个手势识别器,因为它同时接收点击和拖动手势,并且简单地添加目标操作并没有给我所需的功能。至于层次结构,它确实是您描述的第一个层次结构,但是scrollview1 可以工作但scrollview2 不能工作仍然没有意义。我看不出将它们添加到中间视图会如何改变任何事情。
猜你喜欢
  • 2019-08-05
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2014-08-21
  • 2016-09-07
  • 2015-03-05
相关资源
最近更新 更多