需求:使用者在 3 秒內連點 5 次觸發隱藏功能(如開發者選單、測試模式)。核心邏輯:計數器 + 重設計時器,每次點擊遞增計數並重啟 3 秒倒數,倒數歸零則重設計數。
@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
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()
}
UIImpactFeedbackGenerator。UINotificationFeedbackGenerator(.success)。
let tap = UITapGestureRecognizer(target: self, action: #selector(handleFiveTaps))
tap.numberOfTapsRequired = 5
tap.numberOfTouchesRequired = 1
button.addGestureRecognizer(tap)
// 注意:此方式需在極短時間內完成 5 次,容錯率極低,不適合「3 秒內」需求
「計數器 + 重設計時器」模式簡單可靠,完美滿足「N 秒內點擊 M 次」類需求。