问题:viewWithGesture包含viewUserSees,并且可以在蓝色containerView中拖动。但是,viewWithGesture是containerView的子视图,因此当viewWithGesture处于极端时(此处显示 - 在容器视图的一半和一半之外),只有一半的viewWithGesture响应触摸,因此很难拖动。 / p>
注意:我意识到我应该重做所有将其保存在容器中的数学并将其移到containerView之外,但我很好奇要学习如何做到这一点,更糟糕的是"方式。
我已经研究了这一组,并试图实现hittest()和pointInside(),但到目前为止,我已经成功地让应用程序崩溃了。
是否有一种好的,相对干净的方式让用户从containerView外部抓取? (如果可能的话,swift3)
编辑:绿色框是透明的,一半在容器视图中,一半不在。
答案 0 :(得分:2)
为了让视图接收触摸,视图及其所有祖先必须从pointInside:withEvent:
返回true。
通常,如果该点位于视图边界之外,pointInside:withEvent:
将返回false。由于绿色区域中的触摸位于容器视图的边界之外,因此容器视图返回false,因此触摸不会触及手势视图。
要解决此问题,您需要为容器视图创建一个子类并覆盖其pointInside:withEvent:
。在覆盖中,如果该点位于容器视图的边界或手势视图的边界内,则返回true。也许你可能很懒(特别是如果你的容器视图没有很多子视图),如果该点在任何子视图的范围内,则返回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
}
}