我对UILabels有疑问。我甚至不确定这是否正确的方法,但我试图更新UILabel以显示0到24之间的两个数字然后循环回零并再次显示数字序列。问题是,它需要每1/24秒更新一次UILabel。这是我到目前为止的代码......
-(void)viewDidLoad {
fpsTimer = [NSTimer scheduledTimerWithTimeInterval: .01 target: self selector: @selector(updateFpsDisplay) userInfo: nil repeats: YES];
}
- (void)updateFpsDisplay {
for (int i=0; i<100; i++) {
NSLog(@"%d", i%24);
[timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", i%24]];
}
}
此代码在运行时成功打印出控制台循环中的数字1-24,但名为“timecodeFrameLabel”的UILabel只显示03并且不会更改。
有什么建议吗?
答案 0 :(得分:5)
这里有两个问题。首先,您的-updateFpsDisplay
方法从0循环到99,每次循环都会更改标签。但是,在控制返回到运行循环之前,标签实际上不会被重绘。因此,每0.01秒,您将标签更改100次,然后显示更新一次。摆脱循环,让你的计时器告诉你何时更新标签,当你这样做时,只需更新一次。您将需要使用计数器变量i
并将其作为实例变量(希望使用更具描述性的名称)而不是该方法的本地变量。
- (void)updateFpsDisplay {
// the ivar frameCount replaces i
[timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", frameCount%24]];
}
第二个问题是100不是24的倍数。当你说99%24 == 3时,这就是为什么你的标签总是说“3”。在您按上述方法更改了代码后,请在方法-updateFpsDisplay
中添加一项检查,以便frameCount
每次达到0时都会重置,例如:
if (frameCount % 24 == 0) {
frameCount = 0;
}
这会阻止frameCount
变得如此之大以至于它在某个时候翻滚。