使 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 接收点击,但将滑动传递给底层视图的主要内容,如果未能解决你的问题,请参考以下文章
将 UIGestureRecognizer 的所有事件从一个 UIView 传递到另一个 UIView(子视图)[重复]