如何检测水龙头的数量

Posted

技术标签:

【中文标题】如何检测水龙头的数量【英文标题】:How to detect number of taps 【发布时间】:2019-01-16 11:29:04 【问题描述】:

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

我尝试在下面的代码中使用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 中点击 3 次,它将前进 30 秒,如果您点击 4 次,它将前进 40 秒。

【问题讨论】:

点击 3 次后你想要什么输出? 如果我点击 3 次,我需要输出只有 3。现在打印 1 2 3 你写打印语句,所以如果你想要特定的点击,它会打印你要点击多少次按钮然后写一个条件 touch.tapCount == 3 然后打印 3 @AbhishekJadhav 如果我点击四次,它也会通过三次的条件,我已经试过了 是的@Kuldeep 那是我的要求 【参考方案1】:

您没有清楚地定义问题。您是说要在短时间内将一组重复的点击检测为单个、多次点击事件,并报告点击次数吗?如果是这样,您需要添加逻辑来执行此操作。在您认为事件完成之前,决定在轻击之间等待多长时间。

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

所有这些听起来更像是一个点击手势识别器,而不是一个按钮。点击手势识别器被编写来检测特定数量的点击,超时等,但不响应可变数量的点击。您可能想要创建一个自定义手势识别器来响应可变数量的点击而不是按钮。

【讨论】:

我在我的问题中添加了一个编辑 - 例如 - 如果您在 youtube 中点击 3 次,它将前进 30 秒,如果您点击 4 次,它将前进 40 秒。【参考方案2】:
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
         
    

【讨论】:

你的按钮动作方法是touchUpInside吗? 这段代码是可执行的,你用你的替换我的代码来计算点击次数@AbhinavJha 它正在打印所有值 1 2 3 4 5 6 7 8 9 等 我设置了一个条件,如果 tapCount 为 3,那么它正在打印,否则不会打印任何东西?如果要打印特定计数,则必须添加该条件 如果我按下 UIButton 1 次,它只会返回 1 作为数字,如果我点击 UIButton 43 次,它会返回 43 作为数字。我不想在那里设置任何条件【参考方案3】:

引入 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
        

    

编辑:我不是读心者,但我猜你在寻找类似上面的东西(更新代码)

【讨论】:

如果我为例如添加多个条件 - 检查 4 或 5 个水龙头,它不起作用 现在,您应该可以检测到“点击会话”何时结束,看看这个:***.com/a/40070995【参考方案4】:

我不确定您到底需要什么,但在 Duncan 的回答下,我读到您需要从 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

【讨论】:

【参考方案5】:

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

【讨论】:

能否提供更多细节 当然。您需要定义一个计时器,您可以每秒调用一次。在按钮操作中,您需要在全局变量中记录当前时间以及计数。在定时器函数中,您可以检查当前时间与全局变量中的时间之间的时差。 如果时间差大于 1 秒,则可以打印抽头数。【参考方案6】:

这里使用的技术是在执行 最终行动

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

【讨论】:

@Abhinav Jha 答案添加了逻辑,请检查

以上是关于如何检测水龙头的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中检测水龙头的位置

颤振:InkWell 不检测水龙头

如何检测iOS中最近的小按钮的点击?

SwiftUI - 在禁用的 SecureField 中检测水龙头?

是否可以在 appwidget 中检测到长按?

检测点击是在自定义 calloutView 内部还是外部