如果将UIView添加为UIViewControler视图的子视图,并且不将事件添加到UIView。 UIViewControler的方法将被调用。但是,如果您将UIView添加为UIButton的子视图,并且不向UIView添加事件,则不会调用按钮单击事件,这让我感到困惑。当您将按钮添加为UIView的子视图时,也发生了这种情况,按钮没有添加target-action方法,它的superview(UIView)也没有调用任何方法。
答案 0 :(得分:0)
假设您的问题是这样的:为什么点击UIButton
的水龙头不会让UIViewController
视图的touchesBegan
方法被调用?
让我们看一下这个实验项目,为了简单起见,我使用框架而不是约束。
import UIKit
class MyButton: UIButton {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
print("BUTTON TOUCHES BEGAN")
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
let view1 = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
view1.backgroundColor = .black
self.view.addSubview(view1)
let button = MyButton(type: .custom)
button.frame = CGRect(x: 200, y: 100, width: 100, height: 100)
button.setTitle("XXX", for: .normal)
button.backgroundColor = .yellow
button.setTitleColor(.black, for: .normal)
button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
self.view.addSubview(button)
let view2 = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
view2.backgroundColor = .red
button.addSubview(view2)
}
@objc func buttonClicked() {
print("buttonClccked")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
print("TOUCHES BEGAN")
}
}
我做了你提到的每一个案例。
view1
是普通视图。将其添加为控制器视图的子视图,然后点击它会触发控制器中的touchesBegan
。很好。
view2
被添加为按钮的子视图,而不考虑按钮的整个框架,然后点击view2
,按钮的touchesBegan
被触发控制器的。添加
之所以发生这些事情,是因为当您点击按钮时,点击按钮的优先级高于控制器的视图,因为从按钮开始的每次触摸都被视为点击。