我在父视图上有一个子视图。两人都附有touchUpInside
听众。当用户按下孩子时,我希望孩子和父视图都响应这个触摸事件。当用户只按下父级时,我只想要触发父级监听器。
我该怎么做呢?
我已尝试在我的子视图中覆盖以下方法,但在此处返回false会完全忽略子项上的事件。相反,如果我处理子项中的触摸事件,则父项将忽略该事件。
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return false
}
如果您有两个视图的子类,则可以覆盖UIView touchesBegan方法。如果你调用超级touchesBegan
方法,那么当事件沿着响应者链向上移动时,这应该产生你所追求的结果。 (即,如果用户点击子视图,则孩子和父母的触摸事件都会响应)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
print("TOUCHED")
}
快速示例......
点击“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),
])
}
}