首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 偵測 3 秒內點擊 UIButton 5 次:計時器與計數器模式

     編輯:程式設計綜合問答

需求:使用者在 3 秒內連點 5 次觸發隱藏功能(如開發者選單、測試模式)。核心邏輯:計數器 + 重設計時器,每次點擊遞增計數並重啟 3 秒倒數,倒數歸零則重設計數。

標準實作 (Objective-C)


@interface ViewController ()
@property (nonatomic) int tapCount;
@property (nonatomic, strong) NSTimer *resetTimer;
@end

@implementation ViewController

- (IBAction)buttonTapped:(UIButton *)sender {
    self.tapCount++;
    
    if (self.tapCount >= 5) {
        NSLog(@"觸發隱藏功能!");
        [self resetCounter];
        // 執行隱藏功能邏輯
        return;
    }
    
    // 重啟 3 秒計時器
    [self.resetTimer invalidate];
    self.resetTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                                       target:self
                                                     selector:@selector(resetCounter)
                                                     userInfo:nil
                                                      repeats:NO];
}

- (void)resetCounter {
    self.tapCount = 0;
}

- (void)dealloc {
    [self.resetTimer invalidate];
}
@end

Swift 現代寫法


class ViewController: UIViewController {
    private var tapCount = 0
    private var resetTimer: Timer?
    
    @IBAction func buttonTapped(_ sender: UIButton) {
        tapCount += 1
        
        if tapCount >= 5 {
            print("觸發隱藏功能!")
            resetCounter()
            return
        }
        
        resetTimer?.invalidate()
        resetTimer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in
            self.resetCounter()
        }
    }
    
    private func resetCounter() {
        tapCount = 0
    }
    
    deinit { resetTimer?.invalidate() }
}

進階:可配置參數與視覺回饋


class MultiTapDetector {
    let requiredTaps: Int
    let timeWindow: TimeInterval
    var onSuccess: (() -> Void)?
    
    private var tapCount = 0
    private var timer: Timer?
    
    init(requiredTaps: Int = 5, timeWindow: TimeInterval = 3.0) {
        self.requiredTaps = requiredTaps
        self.timeWindow = timeWindow
    }
    
    func registerTap() {
        tapCount += 1
        
        if tapCount >= requiredTaps {
            onSuccess?()
            reset()
            return
        }
        
        timer?.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: timeWindow, repeats: false) { _ in
            self.reset()
        }
    }
    
    private func reset() {
        tapCount = 0
        timer?.invalidate()
        timer = nil
    }
}

// 使用
let detector = MultiTapDetector(requiredTaps: 5, timeWindow: 3.0)
detector.onSuccess = { print("開啟開發者選單") }

@IBAction func buttonTapped(_ sender: UIButton) {
    detector.registerTap()
}

UX 細節建議

  • 第 1-4 次點擊可給予輕微觸覺回饋 UIImpactFeedbackGenerator。
  • 第 5 次觸發時給予成功觸覺 UINotificationFeedbackGenerator(.success)。
  • 避免與系統手勢(如三指縮放、返回手勢)衝突。
  • 生產環境建議改用更複雜手勢(如長按+點擊組合)避免誤觸。

替代方案:UITapGestureRecognizer numberOfTapsRequired


let tap = UITapGestureRecognizer(target: self, action: #selector(handleFiveTaps))
tap.numberOfTapsRequired = 5
tap.numberOfTouchesRequired = 1
button.addGestureRecognizer(tap)

// 注意:此方式需在極短時間內完成 5 次,容錯率極低,不適合「3 秒內」需求

「計數器 + 重設計時器」模式簡單可靠,完美滿足「N 秒內點擊 M 次」類需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved