我正在尝试实现一个检测用户摇晃他/她的iPhone的功能,然后该应用程序会发出吠声。到目前为止,我已经在下面附上了代码,并且它有效。但是,如果我更加努力地晃动手机,它会在另一个之后立即制造2个或更多的树皮。我如何确保每次摇晃只发生一次,无论多么努力?
- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration {
if (acceleration.x > kAccelerationThreshold ||
acceleration.y > kAccelerationThreshold ||
acceleration.z > kAccelerationThreshold) {
// BARKING SOUND
}
}
答案 0 :(得分:5)
您可以使用NSTimer - 请查看此处:section "Timer"
播放声音后,将名为“hasBarked”的布尔变量设置为YES,然后调用计时器。两秒钟后,计时器将“hasBarked”设置为NO并禁用自身。 最后,将整个声音播放方法放入if块中,如果“hasBarked”为NO,则只播放声音。
答案 1 :(得分:3)
为什么不在上次播放声音时保持一个值呢?
time_t last_time_played_bark = 0;
#define MINIMUM_TIME_BETWEEN_BARKS 5 // in seconds
time_t now = time(NULL);
if (last_time_played_bark + MINIMUM_TIME_BETWEEN_BARKS < now) {
// BARKING_SOUND
last_time_played_bark = now;
}
据推测,你希望MINIMUM_TIME_BETWEEN_BARKS至少与播放声音一样长。
答案 2 :(得分:1)
作为旁注,如果您只想检测摇动手势,您可能会发现使用motion events added in OS 3.0比尝试从原始加速度计数据中滚动自己更容易。
我同意Epsilon Prime的建议,即存储上次播放声音时的时间戳,以此来节制播放频率的方法。