14

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

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

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

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

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

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

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

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

4

2 に答える 2

24

基本バナー プロジェクトの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];
}

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

于 2012-08-22T15:38:16.533 に答える
22

ほぼ@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];
}
于 2012-08-22T15:45:25.267 に答える