Добавление долгого нажатия на кнопку при сохранении нормального поведения подсветки? - PullRequest
0 голосов
/ 05 января 2019

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

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

Что я пробовал до сих пор:

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

}

Давайте попробуем щелкнуть один раз и посмотреть, сработает ли это:

enter image description here

Да, да, да.

Теперь посмотрим, что произойдет, если мы долго нажмем на него:

enter image description here

Итак ... вы можете видеть, что кнопка подсвечивается при касании (как обычно), но когда длинное нажатие распознается (входит в начальное состояние), выделение отменяется. Когда мы наконец отпустим касание, число увеличится на 10, как и ожидалось.

Но что, если мы хотим, чтобы кнопка оставалась выделенной в течение всего процесса ...

мы можем попытаться добавить этот код в viewDidLoad ():

buttonLPGR.cancelsTouchesInView = false

Это должно предотвратить отмену первоначального прикосновения распознаванием длинного нажатия.

Посмотрим! :

enter image description here

Хммм, хорошо, мы получили то, что хотели, в том, что касается выделения, но теперь, поскольку обычное нажатие больше не отменяется при длительном нажатии, функция действия touchUpInside кнопки все еще вызывается, и поэтому число увеличивается не только на 10 , но на 1 тоже.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...