问题:viewWithGesture 包含 viewUserSees,并且可以在蓝色 containerView 中拖动。然而,viewWithGesture 是 containerView 的 subview ,因此当 viewWithGesture 处于极端状态时(此处所示 - 一半在 containerView 中,一半在 containerView 外),只有一半的 viewWithGesture 响应触摸,因此很难拖动。
注意:我意识到我应该重做所有将其保留在容器中并将其移出 containerView 的数学运算,但我非常想知道如何以“更糟糕”的方式执行此操作。
我对此进行了大量研究,并尝试实现 hittest() 和 pointInside(),但到目前为止,我成功地让应用程序崩溃了。
有没有好的,比较干净的方式让用户从containerView外面抓取? (如果可能的话,swift3)
编辑:绿色框是透明的,一半在 containerView 中,另一半不在。
最佳答案
为了让 View 接收触摸, View 及其所有祖先必须从 pointInside:withEvent:
返回 true。
通常,如果点在 View 边界之外,pointInside:withEvent:
会返回 false。由于绿色区域中的触摸位于容器 View 的边界之外,因此容器 View 返回 false,因此触摸不会击中手势 View 。
要解决这个问题,您需要为容器 View 创建一个子类并覆盖它的 pointInside:withEvent:
。在您的覆盖中,如果该点位于容器 View 的边界或手势 View 的边界内,则返回 true。也许你可以偷懒(尤其是当你的容器 View 没有很多 subview 时),如果点在任何 subview 的边界内就返回 true。
class ContainerView: UIView {
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
}
}
关于ios - UIView 部分在 superView 之外没有接收到触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45470860/