如何检测抽头数

时间:2019-01-16 11:29:05

标签: ios swift uibutton uigesturerecognizer

我想检测水龙头数量 用户可以点击多次,我必须根据点击次数执行操作。

我尝试将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次,我需要输出仅为3。

编辑1:例如,如果您在youtube中点按三次,则前进30秒,如果点按4次,则前进40秒。

6 个答案:

答案 0 :(得分:1)

您没有明确定义问题。您是说要在短时间内将一组重复的抽头检测为一次多次抽头事件,并报告抽头数量吗?如果是这样,则需要添加逻辑来做到这一点。确定事件完成之前,确定两次轻击之间要等待多长时间。

然后,您需要跟踪发生了多少次点击以及自上次点击以来已持续了多长时间。您需要一个计时器,该计时器会在间隔时间间隔过去且没有新的点击时触发,以便您可以认为事件已完成。

所有这些听起来更像是点击手势识别器,而不是按钮。轻敲手势识别器用于检测特定的轻击次数(包括超时等),但不响应可变数目的轻击。您可能想要创建一个自定义手势识别器,以响应可变数量的轻击而不是按钮。

答案 1 :(得分:0)

您需要检查触摸事件的时差。 例如:如果按下按钮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
    }
}

答案 2 :(得分:0)

引入var来保持点击计数

您修改后的代码将是:

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
        }

    }

编辑:我不介意读者,但我想您正在寻找类似上面的内容(更新的代码)

答案 3 :(得分:0)

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
         }
    }
}

答案 4 :(得分:0)

此处使用的技术是在执行  最后行动

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)")
    }
}

答案 5 :(得分:0)

我不确定您到底需要什么,但是根据邓肯的回答,我读到您需要从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