запутался в следующем корреспонденте uicontrol - PullRequest
0 голосов
/ 29 января 2019

Если вы добавляете UIView как подпредставление представления UIViewControler и не добавляете события в UIView.Будет вызван метод UIViewControler как.Но если вы добавите UIView в качестве подпредставления UIButton и не добавите события в UIView, событие нажатия кнопки не будет вызвано. Так что это меня смутило.Это также происходило, когда вы добавляли кнопку в качестве подпредставления UIView, кнопка не добавляла метод target-action, ее суперпредставление (UIView) не вызывало метод, подобный либо.

1 Ответ

0 голосов
/ 29 января 2019

Предполагая, что ваш вопрос выглядит следующим образом: почему касания 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 кнопки запускаетсявместо контроллера.Добавление

Это происходит потому, что при нажатии на кнопку нажатие кнопки имеет приоритет вместо вида контроллера, поскольку каждое касание, которое начинается с кнопки, считается как нажатие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...