デバイスのモーションイベントを処理し、5秒単位でインターフェースを更新するアプリを使用しています。アプリが実行されている合計時間を表示するインジケーターをアプリに追加したいと思います。ネイティブのiOSClockアプリのようなストップウォッチのようなカウンターは、アプリが実行されている時間をカウントしてユーザーに表示するための合理的な方法のようです。
私が確信していないのは、そのようなストップウォッチの技術的な実装です。これが私が考えていることです:
インターフェイスの更新間隔がわかっている場合は、イベント間の秒数を合計し、秒数をローカル変数として保持できます。あるいは、0.5秒間隔のスケジュールされたタイマーがカウントを提供できます。
アプリの開始日がわかっている場合は、[[NSDate dateWithTimeInterval:(NSTimeInterval) sinceDate:(NSDate *)]
を使用して、インターフェイスの更新ごとにローカル変数を日付に変換できます。
短い時間スタイルのNSDateFormatterを使用して、stringFromDate
メソッドを使用して更新された日付を文字列に変換できます。
結果の文字列は、インターフェイスのラベルに割り当てることができます。
その結果、アプリの「ティック」ごとにストップウォッチが更新されます。
この実装は少し重すぎて、ストップウォッチアプリほど流動的ではないように思えます。アプリが実行されている時間をカウントするためのより良い、よりインタラクティブな方法はありますか?たぶん、この目的のためにiOSによってすでに提供されているものがありますか?
@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];
}
基本的なバナープロジェクトで 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];
}
起動時から実行されるだけで、かなり基本的です。