回应孩子和父母的触摸事件

问题描述 投票:0回答:2

我在父视图上有一个子视图。两人都附有touchUpInside听众。当用户按下孩子时,我希望孩子和父视图都响应这个触摸事件。当用户只按下父级时,我只想要触发父级监听器。

我该怎么做呢?

我已尝试在我的子视图中覆盖以下方法,但在此处返回false会完全忽略子项上的事件。相反,如果我处理子项中的触摸事件,则父项将忽略该事件。

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        return false
    }
ios swift uiview ontouchlistener event-bubbling
2个回答
1
投票

如果您有两个视图的子类,则可以覆盖UIView touchesBegan方法。如果你调用超级touchesBegan方法,那么当事件沿着响应者链向上移动时,这应该产生你所追求的结果。 (即,如果用户点击子视图,则孩子和父母的触摸事件都会响应)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    print("TOUCHED")
}

1
投票

快速示例......

点击“innerView”,你会看到两个“触摸开始”调试打印。点击“outerView”,你只会看到一个。

class TouchView: UIView {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("touches began in \(self)")
    }

}

class TouchTestViewController: UIViewController {

    let innerView: TouchView = {
        let v = TouchView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .red
        return v
    }()

    let outerView: TouchView = {
        let v = TouchView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .cyan
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(outerView)
        outerView.addSubview(innerView)

        NSLayoutConstraint.activate([

            outerView.widthAnchor.constraint(equalToConstant: 300),
            outerView.heightAnchor.constraint(equalToConstant: 300),
            outerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            outerView.centerYAnchor.constraint(equalTo: view.centerYAnchor),

            innerView.widthAnchor.constraint(equalToConstant: 150),
            innerView.heightAnchor.constraint(equalToConstant: 150),
            innerView.centerXAnchor.constraint(equalTo: outerView.centerXAnchor),
            innerView.centerYAnchor.constraint(equalTo: outerView.centerYAnchor),

            ])

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.