Как сделать круг в приложении Stop Watch для iphone - PullRequest
2 голосов
/ 29 июля 2011

Я создаю одно приложение, в котором функция секундомера является вспомогательной функцией.Я пытаюсь сделать что-то очень похожее на секундомер iOS.Я получил остановку, сбросил функционал, но я не смог начать (как только он остановился и пользователь нажал на старт) и функции круга работали правильно.Я попытался осмотреть эту проблему, но не смог найти ничего, кроме однократного руководства по запуску и сбросу секундомера. Вот то, что у меня есть сейчас.Может кто-нибудь помочь мне здесь с этими функциями?

// Stop Watch Code Begins

- (void)updateTimer
{
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString=[dateFormatter stringFromDate:timerDate];
stopWatchLable.text = timeString;
[dateFormatter release];

}

 -(IBAction)startTapped:(id)sender
{
if ([self.start.titleLabel.text isEqualToString:@"Start"])
{
    NSLog(@"Start Tapped");
    [self.start setTitle:@"Stop" forState:UIControlStateNormal];
    [self.reset setTitle:@"Lap" forState:UIControlStateNormal];

    self.startDate =[NSDate date];
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                      target:self
                                                    selector:@selector(updateTimer)
                                                    userInfo:nil
                                                     repeats:YES];

 }
else if ([self.start.titleLabel.text isEqualToString:@"Stop"])
{
    NSLog(@"Stop Tapped");
    [self.start setTitle:@"Start" forState:UIControlStateNormal];
    [self.reset setTitle:@"Reset" forState:UIControlStateNormal];

    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [self updateTimer]; 
}
}
-(IBAction)resetTapped:(id)sender
{   
if ([self.reset.titleLabel.text isEqualToString:@"Reset"])
{
    NSLog(@"Reset Tapped");
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [stopWatchLable setText:@"00:00:00.000"];
}
else if ([self.reset.titleLabel.text isEqualToString:@"Lap"])
{
    NSLog(@"Lap Tapped");        
}
}
-(IBAction)hideTapped:(id)sender
{
CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
CGRect endFrame = self.stopWatchView.frame;
endFrame.origin.y = screenRect.origin.y + screenRect.size.height;

// start the slide down animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];

// we need to perform some post operations after the animation is complete
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(slideDownDidStop)];

self.stopWatchView.frame = endFrame;
[UIView commitAnimations];

// grow the table back again in vertical size to make room for the date picker
CGRect newFrame = self.tableView.frame;
newFrame.size.height += self.stopWatchView.frame.size.height;
self.tableView.frame = newFrame;
//self.tableView.frame = screenRect;

[stopWatchTimer invalidate];
stopWatchTimer = 0;
[stopWatchLable setText:@"00:00:00.000"];
[self updateTimer];
}

1 Ответ

2 голосов
/ 29 июля 2011

Не поймите это неправильно, но у вас есть один неудачный выбор дизайна в вашем коде: вы не должны полагаться на текст кнопки, чтобы сказать вам, что вы хотите сделать - если в какой-то момент в будущем вы локализуете свой приложение вам придется повторить таймер.

Тем не менее, вот как я бы реализовал секундомер: вам нужны две переменные экземпляра, NSTimer timer и NSDate startDate . Для функции круга вам понадобится еще один, NSMutableArray кругов . С вашими двумя кнопками все в порядке, используя простую логику, вы можете решить, что делать при нажатии (непроверенный код!):

Кнопка Пуск / Стоп

if (!timer) {
    self.startDate = [NSDate date];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 10.0
                                                  target:self
                                                selector:@selector(updateTimer)
                                                userInfo:nil
                                                 repeats:YES];
    [self updateTimer];
    // set button text to STOP and LAP
}

// there already is a timer, stopwatch running, so we want to stop
else {
    if ([timer isValid]) {
        [timer invalidate];
    }
    self.timer = nil;
    [self updateTimer];
    // set button text to START and RESET
}

Кнопка сброса / круга

// if we have a timer, we want to take a lap
if (timer) {
    if (!laps) {
        self.laps = [NSMutableArray array];
    }
    [laps addObject:[NSDate date]];
    [self updateTimer];
}

// there is no timer, so we want to reset
else {
    self.startDate = nil;
    [self updateTimer];

    // delete all laps
    self.laps = nil;
}

Теперь вам нужно всего лишь изменить updateTimer , чтобы сделать то, что вы хотите. В updateTimer вы также должны проверить, равен ли startDate ноль или нет, прежде чем вычислять что-либо. Для кругов вы можете просто зациклить массив laps и вычислить разницу между startDate и датой в массиве или даже между датами в массиве.

Надеюсь, это поможет!

...