Search code examples
iosobjective-ccountdowntimepickermilliseconds

TimePicker Count Down in Milliseconds


I have been trying for 2 days, searching high and low and cannot get the milliseconds to work. The hours, mins & seconds work fine, but milliseconds won't.

I've made a lapCounter, which counts UP and has no issues with the milliseconds.

Here is the working code for the lapCounter, which counts UP and the milliseconds work:

    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);

But I can't make the TimePicker Count DOWN, work.

This is what I have for the TimePicker Count DOWN:

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];
}

Solution

  • Try this:

    @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