我非常接近完成我的第一个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]];
}
答案 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
}