Отображение тайм-кода в кадрах в секунду с помощью NSTimer - PullRequest
3 голосов
/ 12 июня 2011

Я работаю над приложением для iPhone / iPad, которое должно отображать часы с временным кодом. Я получил его для отображения правильных часов, минут и секунд без проблем, используя этот код:

    - (void) viewDidLoad {
        // Start the Timer method for here to start it when the view loads.
            runTimer = [NSTimer scheduledTimerWithTimeInterval: .01 target: self selector: @selector(updateDisplay) userInfo: nil repeats: YES];
    }

- (void)updateDisplay {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        NSDate *date = [NSDate date];

        // Display each hour, minute, second and frame.
        [formatter setDateFormat:@"hh"];
        [timecodeHourLabel setText:[formatter stringFromDate:date]];

        [formatter setDateFormat:@"mm"];
        [timecodeMinuteLabel setText:[formatter stringFromDate:date]];

        [formatter setDateFormat:@"ss"];
        [timecodeSecondLabel setText:[formatter stringFromDate:date]];
}

Проблема в том, когда мне нужно отображать кадры в секунду. Я знаю, что вычисление 1/24 * 1000 дает мне количество миллисекунд в одном кадре. Я просто не знаю, как заставить функции NSDate и NSTimer работать с этим кодом и позволить ему обновлять UILabel так быстро, как это необходимо для запуска временного кода.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Если ваш таймер работает с периодом 0,01 с, то его частота составляет 100 кадров / с (ну, лучше сказать, что он имеет 100 вызовов функций в секунду).Но если вам нужно отобразить точный период времени (потому что иногда таймер может быть задержан), вам нужно сохранить предыдущую дату звонка и затем использовать

NSDate* new_date = [NSDate date];
double freq = 1.0 / [new_date timeIntervalSinceDate: old_date];
[old_date release];
old_date = [new_date retain];
0 голосов
/ 19 сентября 2011

Вот эквивалент обработки / Java, который довольно просто переназначить.

String timecodeString(int fps) {
  float ms = millis();
  return String.format("%02d:%02d:%02d+%02d", floor(ms/1000/60/60),    // H
                                              floor((ms/1000/60)%60),       // M (edit: added %60)
                                              floor(ms/1000%60),       // S
                                              floor(ms/1000*fps%fps)); // F
}
...