Предполагая, что ваш вопрос выглядит следующим образом: почему касания 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")
}
}
Я делал все случаи, которые вы упомянули.
The view1
это нормальный вид.Добавление его в качестве подпредставления представления контроллера и нажатие на него вызывает touchesBegan
в контроллере.Это нормально.
view2
добавляется как подпредставление кнопки, принимая или нет весь кадр кнопки, и вы нажимаете на view2
, touchesBegan
кнопки запускаетсявместо контроллера.Добавление
Это происходит потому, что при нажатии на кнопку нажатие кнопки имеет приоритет вместо вида контроллера, поскольку каждое касание, которое начинается с кнопки, считается как нажатие.