0

オーディオの再生時に UISlider ProgressBar を UIToolbar に配置すると、UISlider ProgressBar にオーディオ ファイルの継続時間とオーディオ ファイルの現在の時刻が表示されます。

 - (void)playAction:(id)sender
 {
if([player isPlaying])
{
    [sender setImage:[UIImage imageNamed:@"1play.png"] forState:UIControlStateSelected];
    [player pause];
    //[self pauseTimer];


}else{
    [sender setImage:[UIImage imageNamed:@"audiopause.png"] forState:UIControlStateNormal];
    [player play];
    //[self resumeTimer];


    }

[self updateProgressBar:timer];

}


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

}

しかし、それは機能していません。

手伝ってくれてありがとう。

4

2 に答える 2

1

これを試してください:これは更新スライダー用です。

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES];
        slider.maximumValue = avAudioPlayer.duration;

        [slider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged];

- (void)updateSlider {

    slider.value = avAudioPlayer.currentTime;
}

- (IBAction)sliderChanged:(UISlider *)sender {

    [avAudioPlayer stop];
    [avAudioPlayer setCurrentTime:slider.value];
    [avAudioPlayer prepareToPlay];
    [avAudioPlayer play];
}
于 2013-01-31T04:49:03.777 に答える
1

おそらく、現在行っていること (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];

}
于 2013-01-31T00:15:10.360 に答える