Отображение временного кода с использованием NSTimer и NSDateFormatter - PullRequest
1 голос
/ 17 мая 2010

Я очень близок к завершению моего первого приложения для iPhone, и это было радостью. Я пытаюсь добавить текущий тайм-код с использованием текущего времени через NSTimer, отображающий текущее время (NSDate) на UILabel. NSDate работает нормально для меня, показывая часы, минуты, секунды, миллисекунды. Но вместо миллисекунд мне нужно показывать 24 кадра в секунду.

Проблема в том, что мне нужно, чтобы частота кадров синхронизировалась 100% с часами, минутами и секундами, поэтому я не могу добавить кадры в отдельном таймере. Я попробовал это, и он работал, но таймер кадров не работал синхронно с таймером даты.

Может кто-нибудь помочь мне с этим? Есть ли способ настроить NSDateFormatter, чтобы у меня был таймер даты, отформатированный с 24 кадрами в секунду? Прямо сейчас я ограничен форматированием часов, минут, секунд и миллисекунд.

Вот код, который я сейчас использую

-(void)runTimer {
 // This starts the timer which fires the displayCount method every 0.01 seconds
 runTimer = [NSTimer scheduledTimerWithTimeInterval: .01
            target: self
             selector: @selector(displayCount)
             userInfo: nil
              repeats: YES];
}

//This formats the timer using the current date and sets text on UILabels
- (void)displayCount; {

 NSDateFormatter *formatter =
 [[[NSDateFormatter alloc] init] autorelease];
    NSDate *date = [NSDate date];

 // This will produce a time that looks like "12:15:07:75" using 4 separate labels
 // I could also have this on just one label but for now they are separated

 // This sets the Hour Label and formats it in hours
 [formatter setDateFormat:@"HH"];
 [timecodeHourLabel setText:[formatter stringFromDate:date]];

 // This sets the Minute Label and formats it in minutes
 [formatter setDateFormat:@"mm"];
 [timecodeMinuteLabel setText:[formatter stringFromDate:date]];

 // This sets the Second Label and formats it in seconds
 [formatter setDateFormat:@"ss"];
 [timecodeSecondLabel setText:[formatter stringFromDate:date]];

 //This sets the Frame Label and formats it in milliseconds
 //I need this to be 24 frames per second
 [formatter setDateFormat:@"SS"];
 [timecodeFrameLabel setText:[formatter stringFromDate:date]];

}

Ответы [ 3 ]

1 голос
/ 19 ноября 2013

Много накладных расходов с NSFormatter + NSDate. Плюс ко всему, мне кажется, что NSDate не предоставляет «простую» микровременную ситуацию для простых вещей.

Могга предоставил хороший указатель, вот вариант C / Objective-C:

- (NSString *) formatTimeStamp:(float)seconds {
    int sec = floor(fmodf(seconds, 60.0f));
    return [NSString stringWithFormat:@"%02d:%02d.%02d.%03d",
                        (int)floor(seconds/60/60),          // hours
                        (int)floor(seconds/60),             // minutes
                        (int)sec,                           // seconds
                        (int)floor((seconds - sec) * 1000)  // milliseconds
             ];
}

// NOTE: %02d is C style formatting where:
// % - the usual suspect
// 02 - target length (pad single digits for padding)
// d - the usual suspect

См. это обсуждение для получения дополнительной информации об этом форматировании.

1 голос
/ 17 мая 2010

Я бы посоветовал вам извлечь миллисекунды из вашего NSDate - это в секундах, поэтому дробь даст вам миллисекунды.

Затем просто используйте строку простого формата, чтобы добавить значение, используя NSString метод stringWithFormat:.

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),       // M
                                              floor(ms/1000%60),       // S
                                              floor(ms/1000*fps%fps)); // F
}
...