Отображение временного кода кадров в секунду с помощью NSTimer

Я работаю над приложением для 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 так быстро, как это необходимо для запуска тайм-кода.

Какие-либо предложения?


person Brian    schedule 11.06.2011    source источник


Ответы (2)


Если ваш таймер работает с периодом 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];
person Max    schedule 11.06.2011
comment
Кажется, это хорошо работает, чтобы отображать миллисекунды. Спасибо! Любые идеи о том, как можно заставить это отображаться как кадры в секунду? Мне нужно, чтобы число изменялось от 0 до 23, а затем сбрасывалось до нуля и повторялось. - person Brian; 12.06.2011
comment
for(int i=0; i‹100; ++i) { NSLog(@%d, i%24); } - person Max; 12.06.2011
comment
Цикл for работает, чтобы распечатать числа 0-24 в консоли во время работы приложения, но мне трудно заставить эти числа обновляться на моем UILabel. Код, который я использую для этого: code - (void)updateFpsDisplay { for (int i=0; i‹100; i++) { timecodeFrameLabel.text = [NSString stringWithFormat:@0%d, i%24]; } } code Я также вызываю новый таймер для запуска этого метода, но он просто зависает при обновлении моего UILabel. - person Brian; 13.06.2011
comment
Я только что показал этот цикл, чтобы вы поняли, как можно ограничить число. - person Max; 13.06.2011

Вот эквивалент Processing/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
}
person rjmoggach    schedule 18.09.2011