Как определить количество нажатий - PullRequest
0 голосов
/ 16 января 2019

Я хочу определить количество нажатий Пользователь может нажать несколько раз, и я должен выполнить действие в зависимости от количества нажатий.

Я пытался использовать UIButton с приведенным ниже кодом, но он обнаруживает все касания

если я нажму три раза, то напечатает

1 2 3

Код -

tapButton.addTarget(self, action: #selector(multipleTap(_:event:)), for: UIControl.Event.touchDownRepeat)

@objc func multipleTap(_ sender: UIButton, event: UIEvent) {
    let touch: UITouch = event.allTouches!.first!
    print(touch.tapCount)
}

Мне нужно, чтобы на выходе было только 3, если я нажму три раза.

Редактировать 1: например, если вы нажмете три раза в YouTube, он переместится вперед на 30 секунд, а если вы нажмете 4 раза, то будет вперед на 40 секунд.

Ответы [ 6 ]

0 голосов
/ 16 января 2019

Я не уверен, что именно вам это нужно, но ниже ответа Дункана я прочитал, что вам нужно скопировать что-то из логики YouTube.

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

После первого касания ничего не происходит, но затем после каждого следующего касания вызывается обработчик valueChanged, который вы установите в контроллере представления. Если вы не нажмете кнопку снова до определенной продолжительности ожидания, touches будет сброшено до 0.

class TouchableButton: UIButton {

    var waitDuration: Double = 1.5   // change this for custom duration to reset
    var valueChanged: (() -> Void)?  // set this to handle press of button
    var minimumTouches: Int = 2      // set this to change number of minimum presses

    override init(frame: CGRect) {
        super.init(frame: frame)
        setTarget()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setTarget()
    }

    private func setTarget() {
        addTarget(self, action: #selector(buttonTouched), for: .touchUpInside)
    }

    @objc private func buttonTouched() {
        touches += 1
    }

    private var timer: Timer?

    private var touches: Int = 0 {
        didSet {
            if touches >= minimumTouches {
                valueChanged?()
                timer?.invalidate()
                timer = Timer.scheduledTimer(withTimeInterval: waitDuration, repeats: false) { _ in
                    self.touches = 0
                }
            }
        }
    }

}

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

button.valueChanged = { // button of type `TouchableButton`
    //print("touched")
    ... // move 10s forward or backwards
}

Вы также можете изменить waitDuration свойство, которое определяет время ожидания между последним нажатием и временем, когда touches будет сброшен

button.waitDuration = 1

также вы можете установить минимальное количество касаний (в первый раз при выполнении valueChanged)

button.minimumTouches = 3
0 голосов
/ 16 января 2019

Техника, используемая здесь, представляет временную задержку при выполнении последнее действие

static let tapCount = 0

tapButton.addTarget(self, action: #selector(multipleTap(_:event:)), for: UIControl.Event.touchDownRepeat)

// An average user can tap about 7 times in 1 second using 1 finger 
DispatchQueue.main.asyncAfter(deadLine: .now() + 1.0 /* We're waiting for a second till executing the target method to observe the total no of taps */ ) {
    self.performAction(for: tapCount)
}

@objc func multipleTap(_ sender: UIButton, event: UIEvent) {
    tapCount += 1   
}

/// Perform the respective action based on the taps
private func performAction(for count: Int) {

    // Resetting the taps after 1 second
    tapCount = 0

    switch (count){
    case 2:
        // Handle 2 clicks  
    case 3:
        // Handle 3 clicks  
    case 4:
        // Handle 4 clicks
    default:
        print("Action undefined for count: \(count)")
    }
}
0 голосов
/ 16 января 2019

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

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

Все это больше похоже на распознаватель жестов касания, чем на кнопку. Рекогинизаторы жестов касания написаны для обнаружения определенного количества нажатий, с таймаутами и т. Д., Но не реагируют на переменное количество нажатий. Возможно, вы захотите создать собственный распознаватель жестов, который реагирует на переменное количество нажатий вместо кнопки.

0 голосов
/ 16 января 2019
class ViewController: UIViewController {

  var tapCount: Int = 0

  override func viewDidLoad() {
        super.viewDidLoad()

       tapButton.addTarget(self, action: #selector(multipleTap(sender:)), for: .touchUpInside)

  }

      @objc func multipleTap(sender: UIButton) {
         tapCount += 1
         if tapCount == 3 {
             print(tapCount) //3
         }
    }
}
0 голосов
/ 16 января 2019

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

Ваш модифицированный код будет:

tapButton.addTarget(self, action: #selector(singleTap(_:)), for: .touchUpInside)


    private var numberOfTaps = 0
    private var lastTapDate: Date?

    @objc private func singleTap(_ sender: UIButton) {
        if let lastTapDate = lastTapDate, Date().timeIntervalSince(lastTapDate) <= 1 { // less then a second
            numberOfTaps += 1
        } else {
            numberOfTaps = 0
        }

        lastTapDate = Date()

        if numberOfTaps == 3 {
          // do your rewind stuff here 30 sec
          numberOfTaps = 0
        }

    }

edit: я не читатель, но думаю, вы ищете что-то вроде выше (обновленный код)

0 голосов
/ 16 января 2019

Вам нужно проверить разницу во времени для сенсорных событий. Например: если кнопка нажата 4 раза и в определенное время, скажем, 1 секунда, если она не нажимается снова, вы можете напечатать 4 нажатия, в противном случае не печатать.

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

var timer : Timer?
var timeDuration = 2.0
var tapCount = 0
var lastButtonPressedTime : Date?

@IBAction func tapCountButtonAction(_ sender: UIButton) {
    lastButtonPressedTime = Date()
    if(tapCount == 0){
        tapCount = 1
        timer = Timer.scheduledTimer(withTimeInterval: timeDuration, repeats: true, block: { (timer) in
            let difference = Calendar.current.dateComponents([.second], from:self.lastButtonPressedTime!, to:Date())
            if(difference.second! > 1){
                print(self.tapCount)
                timer.invalidate()
                self.tapCount = 0
            }
        })
    }else{
        tapCount += 1
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...