使用NSTimer和NSDateFormatter显示时间码

时间:2010-05-17 09:27:41

标签: iphone xcode nstimer nsdateformatter

我非常接近完成我的第一个iPhone应用程序,这是一个快乐。我试图通过NSTimer在UILabel上显示当前时间(NSDate),使用当前时间添加运行时间码。 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 个答案:

答案 0 :(得分:1)

我建议您从NSDate中提取毫秒数 - 这是以秒为单位,因此分数将为您提供毫秒数。

然后使用普通格式字符串使用NSString方法stringWithFormat追加值:。

答案 1 :(得分:1)

使用NSFormatter + NSDate进行很多开销。此外,在我看来,NSDate并没有为简单的东西提供“简单”的微缩时间情况。

Mogga提供了一个很好的指针,这是一个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

有关此格式的详情,请参阅this discussion

答案 2 :(得分:0)

这是一个处理/ 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
}