У меня есть кнопка с назначенным ей распознавателем жестов для длительного нажатия.
Я бы хотел, чтобы кнопка оставалась выделенной (как при обычном щелчке) в течение продолжительного нажатия, И чтобы одиночный щелчок НЕ срабатывал после длительного нажатия.
Что я пробовал до сих пор:
Чтобы проиллюстрировать, почему может быть важно иметь эту функцию, давайте возьмем пример UILabel, который отображает число, и кнопку, которая увеличивает это число.
Один щелчок должен увеличить число на 1, а долгое нажатие должно увеличить его на 10 (позже можно добавить таймер, который «автоматически увеличивает» число при удерживании пальца, но для этот пример, я опускаю это).
Итак, я начал с этого кода:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var numberDisplayLabel: UILabel!
@IBOutlet weak var incrementNumberButton: UIButton!
@IBOutlet var buttonLPGR: UILongPressGestureRecognizer!
var numVal = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
numberDisplayLabel.text = String(numVal)
}
@IBAction func buttonClicked(_ sender: UIButton) {
print("button clicked")
numVal += 1
numberDisplayLabel.text = String(numVal)
}
@IBAction func longPressOnButtonRecognized(_ sender: UILongPressGestureRecognizer) {
print("long press recognized, state: \(sender.state.rawValue)")
if (sender.state == .ended) {
numVal += 10
numberDisplayLabel.text = String(numVal)
}
}
}
Давайте попробуем щелкнуть один раз и посмотреть, сработает ли это:
Да, да, да.
Теперь посмотрим, что произойдет, если мы долго нажмем на него:
Итак ... вы можете видеть, что кнопка подсвечивается при касании (как обычно), но когда длинное нажатие распознается (входит в начальное состояние), выделение отменяется. Когда мы наконец отпустим касание, число увеличится на 10, как и ожидалось.
Но что, если мы хотим, чтобы кнопка оставалась выделенной в течение всего процесса ...
мы можем попытаться добавить этот код в viewDidLoad ():
buttonLPGR.cancelsTouchesInView = false
Это должно предотвратить отмену первоначального прикосновения распознаванием длинного нажатия.
Посмотрим! :
Хммм, хорошо, мы получили то, что хотели, в том, что касается выделения, но теперь, поскольку обычное нажатие больше не отменяется при длительном нажатии, функция действия touchUpInside кнопки все еще вызывается, и поэтому число увеличивается не только на 10 , но на 1 тоже.
Здесь я не знаю, что делать с этого момента.
Итак, еще раз: Как мы можем оставить кнопку подсвеченной (как при обычном щелчке) в течение продолжительного нажатия, И чтобы одиночный щелчок НЕ срабатывал после длительного нажатия?
Если сенсорный каркас предоставляет способ сделать это без обходного пути, это было бы предпочтительным.