使 UIView 接收点击,但将滑动传递给底层视图

Posted

技术标签:

【中文标题】使 UIView 接收点击,但将滑动传递给底层视图【英文标题】:Make a UIView receive taps but pass swipes to the underlying view 【发布时间】:2016-01-26 16:54:21 【问题描述】:

我有一个UITableView 和它前面的大“按钮”视图。具有透明区域的“按钮”视图应该能够响应点击。但是为这个视图启用用户交互会阻止任何滚动触摸到达位于“按钮”视图下的表格视图。

上面的视图是UIView(不是UIButton)。考虑到这两个视图是如何协同工作的,上层视图本质上是表格视图的一部分,并对滚动的表格视图做出反应。但滚动是主要的,我希望用户拥有尽可能大的滚动区域。

如何最好地解决此冲突,以便表格视图可以像往常一样滚动?

【问题讨论】:

为什么要在 TableView 上滚动,因为无论如何都部分覆盖了?如果你问我,这似乎是糟糕的界面设计。 Apple 将其作为此类情况的默认行为是有原因的。 上视图相当大,如果不为用户滚动触摸做瞬态,会留下一个不够小的滚动区域。该视图确实需要在表视图上方。 但我的观点是,如果您有一个大(“相当大......滚动区域不够小”)的视图阻塞了您的表格视图,那么为什么用户需要能够滚动表格视图开始? 表格视图没有被视觉遮挡。可以通过上面的视图看到。我在问题中指出了这一点。这两个视图逻辑和交互地连接在一起。 【参考方案1】:

我猜你可以继承你的 UIButton 和 UITableView 通用父视图,并覆盖它的hitTest:withEvent: 来验证哪个视图被点击,比如你是在按钮的透明部分还是不透明部分?

然而,正如 pbush25 所提到的,它或多或少违背了 Apple 的建议。

【讨论】:

上层view是UIView,不是UIButton。鉴于这两个视图是如何协同工作的,上层视图本质上是表格视图的一部分,并响应正在滚动的表格视图。但滚动是主要的,我希望用户拥有尽可能大的滚动区域。 我从你的问题中得到的是,有一个 UIView A,一个 UITableView B 和一个 UIButton C 作为子视图。我说的是对 A superview 进行子类化,以便在 hitTest 中的子视图之间进行选择。 没有 UIButton,只有两个 UIView。不过,上面的视图类似于按钮。 hitTest 如何知道需要执行的是点击还是滚动? 哦,好的。不过,我仍然认为我的答案适用^^。覆盖superview hitTest:,用它来检查选择了哪个子view,并调用这个子视图HitTest:。

以上是关于使 UIView 接收点击,但将滑动传递给底层视图的主要内容,如果未能解决你的问题,请参考以下文章

使 UIControl 仅接受滑动手势并传递触摸/点击手势

如何在视图透明的同时接收滑动手势?

将 UIGestureRecognizer 的所有事件从一个 UIView 传递到另一个 UIView(子视图)[重复]

识别 UIView 中的滑动手势以使用手势识别器滚动滚动视图

从另一个视图将滚动手势传递给 UIScrollView

如何滑动两个 UIView。保持背景不变