UIView 部分在 superView 之外没有接收到触摸
UIView Partially Outside superView Not Receiving Touches
问题:viewWithGesture 包含 viewUserSees,并且可以在蓝色 containerView 中拖动。但是,viewWithGesture 是 containerView 的子视图,因此当 viewWithGesture 处于极端状态时(此处说明 - 一半在 containerView 中,一半在 containerView 之外),只有一半的 viewWithGesture 响应触摸,因此很难拖动。
注意:我意识到我应该重做所有将其保存在容器中并将其移出 containerView 的数学运算,但我非常想知道如何以 "worse" 方式执行此操作。
我对此进行了大量研究,并尝试实施 hittest() 和 pointInside(),但到目前为止,我成功地让应用程序崩溃了。
有没有好的,比较干净的方式让用户从containerView外抓取? (如果可能的话,swift3)
编辑:绿框是透明的,一半在 containerView 中,一半不在。
为了让视图接收触摸,视图及其所有祖先必须 return 从 pointInside:withEvent:
开始为真。
通常,如果点在视图边界之外,pointInside:withEvent:
returns false。由于绿色区域中的触摸在容器视图的边界之外,因此容器视图 return 为 false,因此触摸不会击中手势视图。
要解决此问题,您需要为容器视图创建一个子类并覆盖其 pointInside:withEvent:
。在您的覆盖中,如果该点位于容器视图的边界或手势视图的边界内,则 return 为真。也许你可以懒惰(特别是如果你的容器视图没有很多子视图)并且只是 return 如果点在任何子视图的边界内。
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
}
}
问题:viewWithGesture 包含 viewUserSees,并且可以在蓝色 containerView 中拖动。但是,viewWithGesture 是 containerView 的子视图,因此当 viewWithGesture 处于极端状态时(此处说明 - 一半在 containerView 中,一半在 containerView 之外),只有一半的 viewWithGesture 响应触摸,因此很难拖动。
注意:我意识到我应该重做所有将其保存在容器中并将其移出 containerView 的数学运算,但我非常想知道如何以 "worse" 方式执行此操作。
我对此进行了大量研究,并尝试实施 hittest() 和 pointInside(),但到目前为止,我成功地让应用程序崩溃了。
有没有好的,比较干净的方式让用户从containerView外抓取? (如果可能的话,swift3)
编辑:绿框是透明的,一半在 containerView 中,一半不在。
为了让视图接收触摸,视图及其所有祖先必须 return 从 pointInside:withEvent:
开始为真。
通常,如果点在视图边界之外,pointInside:withEvent:
returns false。由于绿色区域中的触摸在容器视图的边界之外,因此容器视图 return 为 false,因此触摸不会击中手势视图。
要解决此问题,您需要为容器视图创建一个子类并覆盖其 pointInside:withEvent:
。在您的覆盖中,如果该点位于容器视图的边界或手势视图的边界内,则 return 为真。也许你可以懒惰(特别是如果你的容器视图没有很多子视图)并且只是 return 如果点在任何子视图的边界内。
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
}
}