gpt4 book ai didi

ios - 触摸事件不会在部分扩展到父 UIView 之外的子 UIView 之外注册

转载 作者:可可西里 更新时间:2023-11-01 00:54:22 30 4
gpt4 key购买 nike

我有一个包含两个元素的父 View 。本质上,它们包含一个下拉选择。引用下图:单击蓝色元素时,它会显示一个(最初隐藏的)下拉 UITableView。此 UITableView 部分位于还包含蓝色元素的同一父 View 内。

enter image description here

当我尝试单击其中一个 UITableViewCells 时,只有第一个单元格注册了一个触摸事件。如果表格 View 的位置使得第一个单元格部分位于父级内部,则仅单击父级寄存器内部的图像的一半。

这似乎是一个等级问题。我试过:

  1. 调整 Z 指数
  2. 将整个 UITableView 置于 Storyboard 层次结构的父级外部,但在视觉上将其置于其中。

我不确定如何进行。

编辑:

请参阅对我有用的 Andrea 回答。我最终按照建议覆盖了 point 方法,并且没有使用 hitTest。但是,我使用了 point 方法重写的另一个实现:

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
if super.point(inside: point, with: event) { return true }
for subview in subviews {
let subviewPoint = subview.convert(point, from: self)
if subview.point(inside: subviewPoint, with: event) { return true }
}
return false
}

最佳答案

正如 DonMag 所写:

You cannot interact with an element that extends beyond the bounds of its parent (superview).

至少在重写一些方法的情况下, View 有自己的实现来检测触摸。最重要的方法是:

func hitTest(_ point: CGPoint, 
with event: UIEvent?) -> UIView?

func point(inside point: CGPoint,
with event: UIEvent?) -> Bool

这些方法必须被重写,我已经在我的代码上粘贴了一些代码,它们很旧因此可能需要从 3.x 快速迁移到 4.x。您将添加为 subview 的所有内容都将处理触摸,即使在边界之外也是如此:

class GreedyTouchView: UIView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if !self.clipsToBounds && !self.isHidden && self.alpha > 0.0 {
let subviews = self.subviews.reversed()
for member in subviews {
let subPoint = member.convert(point, from: self)
if let result: UIView = member.hitTest(subPoint, with:event) {
return result
}
}
}
return super.hitTest(point, with: event)
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return super.point(inside: point, with: event)
}
}


但我想指出的是,下拉菜单更多地与 Web UI 相关,而不是 iOS UI 相关,您应该改用选择器。

关于ios - 触摸事件不会在部分扩展到父 UIView 之外的子 UIView 之外注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53542133/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com