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
    }

}