Событие касания UIViewContorller все еще получено, даже если представление добавлено - PullRequest
0 голосов
/ 18 марта 2019

Существует простой UIViewController с двумя кнопками, при каждом нажатии кнопки полноэкранный режим будет добавляться к представлению viewcontorller, поскольку его размер такой же, как у viewcontroller.

Мы знаем, что если представление перекрывается со своим родительским видом, родительское представление не может ответить ни на одно событие.

Но если я нажимаю button0, а затем очень быстро нажимаю button1, представление добавляется к viewcontorller, и также вызывается событие касания второй кнопки.

Вот мой код :

@IBAction func button0Pressed(_ sender: Any) {
        print(#function)
        let view0 = UIView(frame: view.bounds)
        view0.backgroundColor = UIColor.gray
        let tap0 = UITapGestureRecognizer(target: self, action: #selector(tap0(_:)))
        view0.addGestureRecognizer(tap0)
        view.addSubview(view0)
    }

    @objc func tap0(_ gestureRecognizer: UITapGestureRecognizer) {
        print(#function)
        let view = gestureRecognizer.view
        view?.removeFromSuperview()
    }

    @IBAction func button1Pressed(_ sender: Any) {
        print(#function)
        let view1 = UIView(frame: view.bounds)
        view1.backgroundColor = UIColor.lightGray
        let tap1 = UITapGestureRecognizer(target: self, action: #selector(tap1(_:)))
        view1.addGestureRecognizer(tap1)
        view.addSubview(view1)
    }


    @objc func tap1(_ gestureRecognizer: UITapGestureRecognizer) {
        print(#function)
        let view = gestureRecognizer.view
        view?.removeFromSuperview()
    }

Out Put:

button0Pressed button1Pressed

Итак, как я могу предотвратить событие быстрого прикосновения viewcontroller после нажатия button0?

1 Ответ

0 голосов
/ 18 марта 2019

Вы можете попробовать использовать обе кнопки (button0 и button1) как IBOutlet и назначить событие touchUpInside для запуска функции button0Press / button1Press.И тогда вы могли бы потенциально enable button1 after x seconds (1 секунда в моем примере), что кнопка0 была нажата.А также и наоборот.

@IBOutlet weak var button0: UIButton!
@IBOutlet weak var button1: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()
    button0.addTarget(self, action: #selector(button0Pressed), for: .touchUpInside)
    button1.addTarget(self, action: #selector(button1Pressed), for: .touchUpInside)
}

@objc func button0Pressed() {
    print(#function)
    let view0 = UIView(frame: view.bounds)
    view0.backgroundColor = UIColor.gray
    let tap0 = UITapGestureRecognizer(target: self, action: #selector(tap0(_:)))
    view0.addGestureRecognizer(tap0)
    view.addSubview(view0)

    // Enable button1 after 1 second
    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
        self.button1.isEnabled = true
    }
}

@objc func button1Pressed() {
    print(#function)
    let view1 = UIView(frame: view.bounds)
    view1.backgroundColor = UIColor.lightGray
    let tap1 = UITapGestureRecognizer(target: self, action: #selector(tap1(_:)))
    view1.addGestureRecognizer(tap1)
    view.addSubview(view1)

    // Enable button0 after 1 second
    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
        self.button0.isEnabled = true
    }
}
...