Добавление долгого нажатия на кнопку при сохранении нормального поведения подсветки?
У меня есть кнопка с назначенным ей жестом распознавания жестов.
Я бы хотел, чтобы кнопка оставалась выделенной (как при обычном щелчке) в течение продолжительного нажатия, И чтобы одиночный щелчок НЕ срабатывал после длительного нажатия.
Что я уже пробовал:
Чтобы проиллюстрировать, почему может быть важно иметь эту функцию, давайте рассмотрим пример 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 также.
Это где я не знаю, что делать с этого момента.
Итак, еще раз: как мы можем оставить кнопку подсвеченной (как при обычном щелчке) на время длительного нажатия, И чтобы одиночный щелчок НЕ срабатывал после длительного нажатия?
Если сенсорная структура предоставляет способ сделать это без обходного пути, это было бы предпочтительным.