web-dev-qa-db-ja.com

ClockストップウォッチのようなiOSアプリに実行中のカウントアップ表示タイマーを追加しますか?

デバイスのモーションイベントを処理し、5秒単位でインターフェースを更新するアプリを使用しています。アプリが実行されている合計時間を表示するインジケーターをアプリに追加したいと思います。ネイティブのiOSClockアプリのようなストップウォッチのようなカウンターは、アプリが実行されている時間をカウントしてユーザーに表示するための合理的な方法のようです。

私が確信していないのは、そのようなストップウォッチの技術的な実装です。これが私が考えていることです:

  • インターフェイスの更新間隔がわかっている場合は、イベント間の秒数を合計し、秒数をローカル変数として保持できます。あるいは、0.5秒間隔のスケジュールされたタイマーがカウントを提供できます。

  • アプリの開始日がわかっている場合は、[[NSDate dateWithTimeInterval:(NSTimeInterval) sinceDate:(NSDate *)]を使用して、インターフェイスの更新ごとにローカル変数を日付に変換できます。

  • 短い時間スタイルのNSDateFormatterを使用して、stringFromDateメソッドを使用して更新された日付を文字列に変換できます。

  • 結果の文字列は、インターフェイスのラベルに割り当てることができます。

  • その結果、アプリの「ティック」ごとにストップウォッチが更新されます。

この実装は少し重すぎて、ストップウォッチアプリほど流動的ではないように思えます。アプリが実行されている時間をカウントするためのより良い、よりインタラクティブな方法はありますか?たぶん、この目的のためにiOSによってすでに提供されているものがありますか?

14
Alex Stone

@terry lewisが提案したものとほぼ同じですが、アルゴリズムを微調整します。

1)タイマーをスケジュールする

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];

2)タイマーが起動したら、現在の時刻を取得し(これは微調整です。タイマーにぐらつきがある場合、ティックカウントはエラーを累積するため、ティックをカウントしないでください)、UIを更新します。また、NSDateFormatterは、表示用の時間をフォーマットするためのよりシンプルで用途の広い方法です。

- (void)timerTick:(NSTimer *)timer {
    NSDate *now = [NSDate date];

    static NSDateFormatter *dateFormatter;
    if (!dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"h:mm:ss a";  // very simple format  "8:47:22 AM"
    }
    self.myTimerLabel.text = [dateFormatter stringFromDate:now];
}
22
danh

基本的なバナープロジェクトで AppleのiAdサンプルコード を見ると、単純なタイマーがあります。

NSTimer *_timer; 
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];

そして彼らが持っている方法

- (void)timerTick:(NSTimer *)timer
{
    // Timers are not guaranteed to tick at the nominal rate specified, so this isn't technically accurate.
    // However, this is just an example to demonstrate how to stop some ongoing activity, so we can live with that inaccuracy.
    _ticks += 0.1;
    double seconds = fmod(_ticks, 60.0);
    double minutes = fmod(trunc(_ticks / 60.0), 60.0);
    double hours = trunc(_ticks / 3600.0);
    self.timerLabel.text = [NSString stringWithFormat:@"%02.0f:%02.0f:%04.1f", hours, minutes, seconds];
}

起動時から実行されるだけで、かなり基本的です。

24
terry lewis