【问题标题】:NSTimer countdown tickNSTimer 倒计时刻度
【发布时间】:2015-09-17 14:06:03
【问题描述】:

请原谅我的英语,我不是很流利。

我有一个包含 10 次锻炼的应用程序,我想给每次锻炼一定的时间,例如: 第一次锻炼:30 秒 第二次锻炼:40 秒

但现在,我只设法为每次锻炼提供相同的秒数。

这是我以前的工作:

#define EXERCISELENGTH 30
#define EXERCISELENGTH1 40
#define RESTLENGTH 10

- (void)tick
{
if (self.inCountdown && (countdown == 0)) {
    self.inCountdown = NO;
    self.inExercise = YES;
    countdown = EXERCISELENGTH;
    [self workoutUI];
    [self updateUI];
    workoutIndex++;
}

if (self.inExercise && (countdown == 0)) {
    self.inExercise = NO;
    self.inRest = YES;
    countdown = RESTLENGTH;
    [self restUI];
    [self updateUI];
}
if (self.inRest && (countdown == 0)) {
    self.inRest = NO;
    self.inExercise = YES;
    countdown = EXERCISELENGTH;
    [self workoutUI];
    [self updateUI];
    workoutIndex++;
    if (workoutIndex == 10) {
        [self doneUI];
        [self.timer invalidate];
        return;
    }
}
[self updateUI];
countdown--;
}

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 所以您想同时为所有锻炼运行计时器?
  • 不,我想在第一次锻炼时运行计时器 30 秒,然后休息 10 秒,然后在第二次锻炼时运行 40 秒等...

标签: ios nstimer


【解决方案1】:

你有很多选择:

如果你想每 30 秒调用一次锻炼方法,你可以这样:

  [NSTimer scheduledTimerWithTimeInterval:30.0
                                     target:self
                                   selector:@selector(workoutMethod)
                                   userInfo:nil
                                    repeats:YES];

如果你想在 30 秒后调用锻炼方法,你可以这样:

 [self performSelector:@selector(workoutMethod) withObject:nil afterDelay:30.0];

如果你想在开始锻炼方法后开始倒计时,你可以使用这个例子:CountDown Timer ios tutorial?

【讨论】:

  • 我已经这样做了。我想做的是给每次锻炼一个特定的时间。
  • 好吧,我承认了。给每次锻炼特定的时间是什么意思?这与锻炼开始后运行倒计时有何不同?
  • 这就是我当前的代码发生的情况:锻炼 1:30 秒锻炼 2:30 秒锻炼 3:30 秒但我想要做的是:锻炼 1:20 秒锻炼 2:30 秒锻炼 3:40 秒。
【解决方案2】:

如果你想要一个倒数计时器,你应该设置一个重复的NSTimer,它会触发一个动作,每秒钟左右更新一次显示。但是,该操作应使用系统时间计算剩余时间。所以,你的代码应该:

  • 获取当前时间并根据所需时间段(20 秒、30 秒等)计算预计完成时间
  • 以 1 秒的间隔启动重复计时器

你的计时器的动作应该:

  • 获取当前系统时间
  • 与预期完成时间比较
  • 更新显示
  • 如果已经到了结束时间,就会使自己失效

想要做的是依靠计时器以精确的 1 秒间隔触发。 NSTimer 的分辨率使得每个“滴答声”最多可以关闭 0.1 秒,这意味着 30 个滴答声最多可以关闭 3 秒。使用系统时间,例如CACurrentMediaTime(),将提供更准确的时钟并避免错误累积。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多