使用NSTimer显示每秒帧数时间码

时间:2011-06-11 23:35:28

标签: objective-c ios cocoa-touch uilabel 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给了我一帧中有多少毫秒。我只是不知道如何使NSDateNSTimer函数与此代码一起使用,并允许它根据运行时间码的需要尽快更新UILabel

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果你的计时器以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];

答案 1 :(得分: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)%60),       // M (edit: added %60)
                                              floor(ms/1000%60),       // S
                                              floor(ms/1000*fps%fps)); // F
}