TimePicker 以毫秒为单位倒计时
TimePicker Count Down in Milliseconds
我已经尝试了 2 天,上下搜索,无法让毫秒工作。小时、分钟和秒都可以,但毫秒不行。
我做了一个 lapCounter,它可以向上计数并且没有毫秒问题。
这是 lapCounter 的工作代码,它向上计数和毫秒工作:
int hours = (UInt8)(elapsedTime /(60*60));
int mins = (UInt8)(elapsedTime / 60.0);
elapsedTime -= (mins * 60);
int secs = (UInt8)(elapsedTime);
elapsedTime -= (secs);
int mms = (UInt8)(elapsedTime * 100);
但我无法让 TimePicker 倒计时,工作。
这是我的 TimePicker 计数向下:
int afterRemainder;
int remainder;
NSTimeInterval countDownTime;
NSTimer *countDownTimer;
bool startCountDown;
- (IBAction)startCountDownButton:(id)sender {
if (startCountDown == false) {
countDownTime = (NSTimeInterval)_datePicker.countDownDuration;
remainder = countDownTime;
afterRemainder = countDownTime - remainder%60;
countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCountDown) userInfo:nil repeats:YES];
startCountDown = true;
}
-(void)updateCountDown {
afterRemainder --;
int hours = (int)(afterRemainder / (60 * 60));
int mins = (int)(afterRemainder / 60) - (60 * hours);
int secs = (int)(afterRemainder - (60 * mins) - (60 * hours * 60));
int mms = (int)(afterRemainder - (3600 * secs) - (mins * 60));
self.displayCountDown.text = [[NSString alloc] initWithFormat:@"%02d", hours];
self.displayCountDownMins.text = [[NSString alloc] initWithFormat:@": %02d", mins];
self.displayCountDownSecs.text = [[NSString alloc] initWithFormat:@"%02d", secs];
self.displayCountDownMMs.text = [[NSString alloc] initWithFormat:@":%2d", mms];
}
使用 CADisplayLink,而不是 NSTimer。
CADisplayLink 对象是一个计时器对象,它允许您的应用程序将其绘图与显示器的刷新率同步。
使用 [NSTimer scheduledTimerWithTimeInterval:1 ...] 系统无法以该速度绘制标签。
试试这个:
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UILabel *hours;
@property (nonatomic, weak) IBOutlet UILabel *minutes;
@property (nonatomic, weak) IBOutlet UILabel *seconds;
@property (nonatomic, weak) IBOutlet UILabel *millisecs;
@property (nonatomic, readwrite) NSTimeInterval counter;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, readwrite) int hoursInt;
@property (nonatomic, readwrite) int minutesInt;
@property (nonatomic, readwrite) int secondsInt;
@property (nonatomic, readwrite) int millisecsInt;
@end
@implementation ViewController
#define MS_COUNT_STEP 20.0 // Approx 50 fps
- (IBAction)countUpPressed:(id)sender {
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:MS_COUNT_STEP / 1000.0 target:self selector:@selector(countUp) userInfo:nil repeats:YES];
}
- (IBAction)countDownPressed:(id)sender {
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:MS_COUNT_STEP / 1000.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
}
- (void)countUp {
self.counter += (MS_COUNT_STEP / 1000.0);
}
- (void)countDown {
self.counter -= (MS_COUNT_STEP / 1000.0);
}
- (void)setCounter:(NSTimeInterval)counter {
_counter = counter;
[self updateUI];
}
- (void)updateUI {
NSTimeInterval counter = _counter;
self.hoursInt = counter / 3600;
counter -= ((int)self.hoursInt * 3600);
self.minutesInt = counter / 60;
counter -= ((int)self.minutesInt * 60);
self.secondsInt = (int)counter;
counter -= self.secondsInt;
self.millisecsInt = counter * 1000;
}
- (void)setHoursInt:(int)value {
if (value != _hoursInt) {
_hoursInt = value;
self.hours.text = [NSString stringWithFormat:@"%i", value];
}
}
- (void)setMinutesInt:(int)value {
if (value != _minutesInt) {
_minutesInt = value;
self.minutes.text = [NSString stringWithFormat:@"%i", value];
}
}
- (void)setSecondsInt:(int)value {
if (value != _secondsInt) {
_secondsInt = value;
self.seconds.text = [NSString stringWithFormat:@"%i", value];
}
}
- (void)setMillisecsInt:(int)value {
if (value != _millisecsInt) {
_millisecsInt = value;
self.millisecs.text = [NSString stringWithFormat:@"%i", value];
}
}
@end
我已经尝试了 2 天,上下搜索,无法让毫秒工作。小时、分钟和秒都可以,但毫秒不行。
我做了一个 lapCounter,它可以向上计数并且没有毫秒问题。
这是 lapCounter 的工作代码,它向上计数和毫秒工作:
int hours = (UInt8)(elapsedTime /(60*60));
int mins = (UInt8)(elapsedTime / 60.0);
elapsedTime -= (mins * 60);
int secs = (UInt8)(elapsedTime);
elapsedTime -= (secs);
int mms = (UInt8)(elapsedTime * 100);
但我无法让 TimePicker 倒计时,工作。
这是我的 TimePicker 计数向下:
int afterRemainder;
int remainder;
NSTimeInterval countDownTime;
NSTimer *countDownTimer;
bool startCountDown;
- (IBAction)startCountDownButton:(id)sender {
if (startCountDown == false) {
countDownTime = (NSTimeInterval)_datePicker.countDownDuration;
remainder = countDownTime;
afterRemainder = countDownTime - remainder%60;
countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCountDown) userInfo:nil repeats:YES];
startCountDown = true;
}
-(void)updateCountDown {
afterRemainder --;
int hours = (int)(afterRemainder / (60 * 60));
int mins = (int)(afterRemainder / 60) - (60 * hours);
int secs = (int)(afterRemainder - (60 * mins) - (60 * hours * 60));
int mms = (int)(afterRemainder - (3600 * secs) - (mins * 60));
self.displayCountDown.text = [[NSString alloc] initWithFormat:@"%02d", hours];
self.displayCountDownMins.text = [[NSString alloc] initWithFormat:@": %02d", mins];
self.displayCountDownSecs.text = [[NSString alloc] initWithFormat:@"%02d", secs];
self.displayCountDownMMs.text = [[NSString alloc] initWithFormat:@":%2d", mms];
}
使用 CADisplayLink,而不是 NSTimer。
CADisplayLink 对象是一个计时器对象,它允许您的应用程序将其绘图与显示器的刷新率同步。
使用 [NSTimer scheduledTimerWithTimeInterval:1 ...] 系统无法以该速度绘制标签。
试试这个:
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UILabel *hours;
@property (nonatomic, weak) IBOutlet UILabel *minutes;
@property (nonatomic, weak) IBOutlet UILabel *seconds;
@property (nonatomic, weak) IBOutlet UILabel *millisecs;
@property (nonatomic, readwrite) NSTimeInterval counter;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, readwrite) int hoursInt;
@property (nonatomic, readwrite) int minutesInt;
@property (nonatomic, readwrite) int secondsInt;
@property (nonatomic, readwrite) int millisecsInt;
@end
@implementation ViewController
#define MS_COUNT_STEP 20.0 // Approx 50 fps
- (IBAction)countUpPressed:(id)sender {
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:MS_COUNT_STEP / 1000.0 target:self selector:@selector(countUp) userInfo:nil repeats:YES];
}
- (IBAction)countDownPressed:(id)sender {
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:MS_COUNT_STEP / 1000.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
}
- (void)countUp {
self.counter += (MS_COUNT_STEP / 1000.0);
}
- (void)countDown {
self.counter -= (MS_COUNT_STEP / 1000.0);
}
- (void)setCounter:(NSTimeInterval)counter {
_counter = counter;
[self updateUI];
}
- (void)updateUI {
NSTimeInterval counter = _counter;
self.hoursInt = counter / 3600;
counter -= ((int)self.hoursInt * 3600);
self.minutesInt = counter / 60;
counter -= ((int)self.minutesInt * 60);
self.secondsInt = (int)counter;
counter -= self.secondsInt;
self.millisecsInt = counter * 1000;
}
- (void)setHoursInt:(int)value {
if (value != _hoursInt) {
_hoursInt = value;
self.hours.text = [NSString stringWithFormat:@"%i", value];
}
}
- (void)setMinutesInt:(int)value {
if (value != _minutesInt) {
_minutesInt = value;
self.minutes.text = [NSString stringWithFormat:@"%i", value];
}
}
- (void)setSecondsInt:(int)value {
if (value != _secondsInt) {
_secondsInt = value;
self.seconds.text = [NSString stringWithFormat:@"%i", value];
}
}
- (void)setMillisecsInt:(int)value {
if (value != _millisecsInt) {
_millisecsInt = value;
self.millisecs.text = [NSString stringWithFormat:@"%i", value];
}
}
@end