更新iOS 5中的进度条

时间:2012-03-13 19:06:05

标签: iphone ios progress-bar avaudioplayer

我正在开发一个iOS音频播放器,我想实现一个进度条,指示正在播放的当前歌曲的进度。 在我的ViewController类中,我有2个双实例 - 时间和持续时间,以及一个名为background的AVAudioPlayer实例。

- (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 个答案:

答案 0 :(得分:9)

在播放期间,您不会更新进度条的进度。当您开始播放声音时,您将进度条设置为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;