UIView部分外部超级视图未接收触摸

时间:2017-08-02 20:56:57

标签: ios swift3 uiview uigesturerecognizer

问题:viewWithGesture包含viewUserSees,并且可以在蓝色containerView中拖动。但是,viewWithGesture是containerView的子视图,因此当viewWithGesture处于极端时(此处显示 - 在容器视图的一半和一半之外),只有一半的viewWithGesture响应触摸,因此很难拖动。 / p>

注意:我意识到我应该重做所有将其保存在容器中的数学并将其移到containerView之外,但我很好奇要学习如何做到这一点,更糟糕的是"方式。

我已经研究了这一组,并​​试图实现hittest()和pointInside(),但到目前为止,我已经成功地让应用程序崩溃了。

是否有一种好的,相对干净的方式让用户从containerView外部抓取? (如果可能的话,swift3)

编辑:绿色框是透明的,一半在容器视图中,一半不在。

stupid problem

1 个答案:

答案 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
    }

}