おそらく、現在行っていること (playAction メソッドで呼び出す) ではなく、タイマーを使用して updateProgressBar メソッドを呼び出したいと思うでしょう。代わりに、playAction メソッドを使用して、updateProgressBar を呼び出すタイマーを作成するか、既存のタイマーを一時停止/停止できます。
タイマーを追跡するためのインスタンス変数が既にあるようです。これは良いことです。新しいタイマーを作成する方法は次のとおりです。
[timer invalidate]; // stop the old timer
// this timer runs once per second, perhaps you want to make it something shorter which would look less choppy
NSTimer *progressTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateProgressBar:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:progressTimer forMode:NSRunLoopCommonModes];
timer = progressTimer;
オーディオを一時停止する方法がある場合は、そこでタイマーを無効にすることもできます。
[timer invalidate];
timer = nil;
全体として、コードでは、これは次のようになります。
- (void)playAction:(id)sender
{
if([player isPlaying])
{
[sender setImage:[UIImage imageNamed:@"1play.png"] forState:UIControlStateSelected];
[player pause];
[timer invalidate];
timer = nil;
} else {
[sender setImage:[UIImage imageNamed:@"audiopause.png"] forState:UIControlStateNormal];
[player play];
[timer invalidate];
NSTimer *progressTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateProgressBar:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:progressTimer forMode:NSRunLoopCommonModes];
timer = progressTimer;
}
}
- (void)updateProgressBar:(NSTimer *)timer
{
NSTimeInterval playTime = [self.player currentTime];
NSTimeInterval duration = [self.player duration];
float progress = playTime/duration;
[_progressBar setProgress:progress];
}