1

秒とミリ秒を表示するカウントダウンタイマーを作成しようとして失敗した場所を見つけようとしています。アイデアは、タイマーがUILableを更新するNSStringへのカウントダウン時間を表示することです。

私が現在持っているコードは

-(void)timerRun {
    if (self.timerPageView.startCountdown) {
        NSLog(@"%i",self.timerPageView.xtime);

    self.timerPageView.sec = self.timerPageView.sec - 1;

    seconds = (self.timerPageView.sec % 60) % 60 ;
    milliseconds = (self.timerPageView.sec % 60) % 1000;


    NSString *timerOutput = [NSString stringWithFormat:@"%i:%i", seconds, milliseconds];
    self.timerPageView.timerText.text = timerOutput;

    if (self.timerPageView.resetTimer == YES) {
       [self setTimer];
}
}
    else {

    }


}

-(void)setTimer{
    if (self.timerPageView.xtime == 0) {
        self.timerPageView.xtime = 60000;
    }
    self.timerPageView.sec = self.timerPageView.xtime;
    self.timerPageView.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerRun) userInfo:Nil repeats:YES];
    self.timerPageView.resetTimer = NO;
}

    int seconds;
    int milliseconds;
    int minutes;
}

誰が私が間違っているのか考えていますか?

4

3 に答える 3

4

1 秒あたり約 100 回 (間隔 0.01) 実行されるタイマーがあります。

1毎回値を減らします。したがって、self.timerPageView.sec変数は 100 分の 1 秒のように見えます。

秒数を取得するには、この値を 100 で割る必要があります。ミリ秒数を取得するには、10 を掛けてから 1000 でモジュロする必要があります。

seconds = self.timerPageView.sec / 100;
milliseconds = (self.timerPageView.sec * 10) % 1000;

アップデート:

また、タイマーが非常に不正確であることにも注意してください。タイマーは 100 分の 1 秒ごとに正確に繰り返されるわけではありません。1 秒あたり 80 回しか実行されないか、その他の不正確な速度で実行される場合があります。

より良いアプローチは、開始時に現在の時刻を取得することです。次に、timerRunメソッド内で現在の時刻を再度取得します。2 つの数値を減算します。これにより、実際の経過時間が得られます。ループごとに値を減らす代わりに、これを使用します。

于 2013-08-23T00:21:29.103 に答える
3

これらの計算はかなり怪しいように見えます:

seconds = (self.timerPageView.sec % 60) % 60 ;
milliseconds = (self.timerPageView.sec % 60) % 1000;

float 値に対して int 型の計算 (実装がかなり大ざっぱです) を数秒間使用しています。

   NSUInteger seconds = (NSUInteger)(self.timerPageView.sec * 100); //convert to an int
   NSUInteger milliseconds = (NSUInteger) ((self.timerPageView.sec - seconds)* 1000.);
于 2013-08-23T00:19:16.023 に答える
3

時間間隔を 0.01 に設定します。これは 10 ミリ秒ごとで、0.001 はミリ秒ごとです。
それでも、NSTimer はそれほど正確ではありません。おそらく、1 ミリ秒ごとに動作させることはできません。実行ループから起動されるため、遅延とジッターがあります。

于 2013-08-23T00:20:37.250 に答える