выяснить, какая кнопка была нажата, в то время как отличаются между долгим нажатием и нажатием. быстрый - PullRequest
0 голосов
/ 07 апреля 2020

Итак, у меня есть слушатели для длительного и короткого нажатия на кнопки, но мне нужно знать, какая кнопка была нажата. Можно ли узнать, какая кнопка была нажата в кране и долгая функция, или мне нужно будет сделать две функции для каждой кнопки?

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
longGesture.minimumPressDuration = 0.5
smallOption.addGestureRecognizer(tapGesture)
mediumOption.addGestureRecognizer(tapGesture)
largeOption.addGestureRecognizer(tapGesture)
smallOption.addGestureRecognizer(longGesture)
mediumOption.addGestureRecognizer(longGesture)
largeOption.addGestureRecognizer(longGesture)

@objc func tap(_ sender: UIGestureRecognizer){
    print("short-press")
}
@objc func long(_ sender: UIGestureRecognizer){
    print("long-press")
}

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Основная проблема, в данном случае, заключается в том, что оба жеста будут добавлены ТОЛЬКО для кнопки largeOption! Для пояснения, жест добавляется только для одного компонента, который в вашем случае должен добавляться только для самого последнего (то есть largeOption):

smallOption.addGestureRecognizer(tapGesture) <-- skipped
mediumOption.addGestureRecognizer(tapGesture) <-- skipped
largeOption.addGestureRecognizer(tapGesture) <-- added
smallOption.addGestureRecognizer(longGesture) <-- skipped
mediumOption.addGestureRecognizer(longGesture) <-- skipped
largeOption.addGestureRecognizer(longGesture) <-- added

Логически говоря, это может быть ответ на свой вопрос:

Можно ли узнать, какая кнопка была нажата в функции tap и long, или мне нужно будет сделать две функции для каждой кнопки?

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

Однако вам не нужно объявлять новые методы действий в дополнение к @objc func tap(_ sender: UIGestureRecognizer) и @objc func long(_ sender: UIGestureRecognizer) существующие. Вместо этого вы можете проверить вид sender. Пример:

Предположим, что мы вручную добавили жесты буксировки для каждой кнопки:

// gestures:
let smallOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let smallOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
smallOptionLongGesture.minimumPressDuration = 0.5

let mediumOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let mediumOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
mediumOptionLongGesture.minimumPressDuration = 0.5

let largeOptionTapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
let largeOptionLongGesture = UILongPressGestureRecognizer(target: self, action: #selector(long))
largeOptionLongGesture.minimumPressDuration = 0.5

// adding them:
smallOption.addGestureRecognizer(smallOptionTapGesture)
mediumOption.addGestureRecognizer(mediumOptionTapGesture)
largeOption.addGestureRecognizer(largeOptionTapGesture)

smallOption.addGestureRecognizer(smallOptionLongGesture)
mediumOption.addGestureRecognizer(mediumOptionLongGesture)
largeOption.addGestureRecognizer(largeOptionLongGesture)

Поэтому вы можете сделать следующее:

@objc func tap(_ sender: UIGestureRecognizer) {
    // an example of how you could check the button
    if sender.view == smallOption {
        print("small short-press")
    } else if sender.view == mediumOption {
        print("medium short-press")
    } else if sender.view == largeOption {
        print("large short-press")
    }
}
@objc func long(_ sender: UIGestureRecognizer) {
    // you could apply the same above approach here
}

Другой вариант: создать методы действий для каждой кнопки отдельно.

0 голосов
/ 07 апреля 2020

Вам не нужны две функции для одного и того же жеста для каждой кнопки. Измените определение метода, чтобы принять UIButton (в вашем случае) вместо UIGestureRecognizer. После этого проверьте отправителя, проверив тег или тип напрямую ...

@objc func tap(_ sender: UIButton){
  switch sender {
  case button1: // or by tags of buttons
  case button2:
  ...
  default: break
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...