Обновление индикатора выполнения в iOS 5 - PullRequest
1 голос
/ 13 марта 2012

Я занимаюсь разработкой аудиопроигрывателя для iOS и хочу добавить индикатор выполнения, который будет отображать ход воспроизведения текущей воспроизводимой песни.В моем классе ViewController у меня есть 2 двойных экземпляра - время и продолжительность, и экземпляр AVAudioPlayer, называемый background.

- (IBAction)play:(id)sender {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"some_song" ofType:@"mp3"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];
    background = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
    background.delegate = self;
    [background setNumberOfLoops:1];
    [background setVolume:0.5];
    [background play];
    time = 0;
    duration = [background duration];
    while(time < duration){
        [progressBar setProgress: (double) time/duration animated:YES];
        time += 1; 
    } 
}

Может кто-нибудь объяснить, что я делаю не так?Заранее спасибо.

1 Ответ

9 голосов
/ 13 марта 2012

вы не обновляете прогресс индикатора выполнения во время воспроизведения.Когда вы начинаете воспроизводить звук, вы устанавливаете индикатор выполнения на 1, на 2, на 3, на 4, на 5 ... на 100%.Все не выходя из текущего runloop.Это означает, что вы увидите только последний шаг, полный индикатор выполнения.

Вы должны использовать NSTimer для обновления индикатора выполнения.Примерно так:

- (IBAction)play:(id)sender {
    /* ... */
    [self.player play];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.23 target:self selector:@selector(updateProgressBar:) userInfo:nil repeats:YES];
}

- (void)updateProgressBar:(NSTimer *)timer {
    NSTimeInterval playTime = [self.player currentTime];
    NSTimeInterval duration = [self.player duration];
    float progress = playTime/duration;
    [self.progressView setProgress:progress];
}

при остановке воспроизведения отключить таймер.

[self.timer invalidate];
self.timer = nil;
...