Добавление долгого нажатия на кнопку при сохранении нормального поведения подсветки?

У меня есть кнопка с назначенным ей жестом распознавания жестов.

Я бы хотел, чтобы кнопка оставалась выделенной (как при обычном щелчке) в течение продолжительного нажатия, И чтобы одиночный щелчок НЕ срабатывал после длительного нажатия.

Что я уже пробовал:

Чтобы проиллюстрировать, почему может быть важно иметь эту функцию, давайте рассмотрим пример 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 также.

Это где я не знаю, что делать с этого момента.

Итак, еще раз: как мы можем оставить кнопку подсвеченной (как при обычном щелчке) на время длительного нажатия, И чтобы одиночный щелчок НЕ срабатывал после длительного нажатия?

Если сенсорная структура предоставляет способ сделать это без обходного пути, это было бы предпочтительным.

0 ответов

Другие вопросы по тегам