ios - UIView 部分在 superView 之外没有接收到触摸

标签 ios swift3 uiview uigesturerecognizer

问题:viewWithGesture 包含 viewUserSees,并且可以在蓝色 containerView 中拖动。然而,viewWithGesture 是 containerView 的 subview ,因此当 viewWithGesture 处于极端状态时(此处所示 - 一半在 containerView 中,一半在 containerView 外),只有一半的 viewWithGesture 响应触摸,因此很难拖动。

注意:我意识到我应该重做所有将其保留在容器中并将其移出 containerView 的数学运算,但我非常想知道如何以“更糟糕”的方式执行此操作。

我对此进行了大量研究,并尝试实现 hittest() 和 pointInside(),但到目前为止,我成功地让应用程序崩溃了。

有没有好的,比较干净的方式让用户从containerView外面抓取? (如果可能的话,swift3)

编辑:绿色框是透明的,一半在 containerView 中,另一半不在。

stupid problem

最佳答案

为了让 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/

相关文章:

ios - 按下按钮时更改按钮 "+"、 "-"、 "/"、 "*"的背景(清晰且相等)。 (IOS)

ios - swift 3 网页 View

ios - 自定义 UIView 使用 init(coder) 初始化,如何使用 init(frame) 初始化它

ios - 向ios NSString中的某些文本添加点击事件

ios - Xamarin 表单 IOS 项目中的图标清晰度不佳

ios - 由于对调度组的调用不平衡导致不明显的崩溃

ios - 如何在 iOS 应用程序后台发出间歇性 HTTP POST 请求 - Swift

ios - 方法 swizzle 的 Swift 3 迁移后缺少 ',' 分隔符

ios - 尝试转换场景时无法将 UIView 的值转换为 SCNView

swift - 从 Bundle 加载 UIView 只会部分填满屏幕