2012-03-02 11 views
1

を再開したときに更新するビューを再開するためにどのように私は私が持っている問題は、私はビューから一時停止したいaudioplayerを一時停止する場合である。このAVAudioplayer

のための任意の解決策を見つけることができそう長くはなく、この問題で苦労メートル私はタイマーを無効にして、ビューの読み込みを一時停止するようにしていましたが、再生を再開するときだけAudioplayerが再開されました。

これで、ビューが一時停止していたポイントからビューを更新する方法を再開できます。タイマーをもう一度起動することで、ビューの更新をやり直すことができますが、プログラムはどのビューで一時停止していたのかを知ることができ、そのポイントからのビューの更新を再開する必要があります。 2つしか表示されない複数のビューがあります。

-(void)playpauseAction:(id)sender 
{ 
    if 

    ([audioPlayer isPlaying]){ 

[sender setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateSelected]; 

[audioPlayer pause]; 

[timer invalidate]; 

    } else { 

[sender setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal]; 

[audioPlayer play]; 

self.timer = [NSTimer scheduledTimerWithTimeInterval:11 target:self selector:@selector(displayviewsAction:) userInfo:nil repeats:NO]; 
    } 

} 

- (void)displayviewsAction:(id)sender 

FirstViewController *viewController = [[FirstViewController alloc] init]; 

viewController.view.frame = CGRectMake(0, 0, 320, 480); 

[self.view addSubview:viewController.view]; 

[self.view addSubview:toolbar]; 

[viewController release]; 

self.timer = [NSTimer scheduledTimerWithTimeInterval:23 target:self selector:@selector(secondViewController) userInfo:nil repeats:NO]; 

-(void)secondViewController { 
SecondViewController *secondController = [[SecondViewController alloc] init]; 

secondController.view.frame = CGRectMake(0, 0, 320, 480); 

[self.view addSubview:secondController.view]; 

[self.view addSubview:toolbar]; 

[secondController release]; 

self.timer = [NSTimer scheduledTimerWithTimeInterval:27 target:self selector:@selector(ThirdviewController) userInfo:nil repeats:NO]; 
} 

ご回答いただきありがとうございます。

答えて

1

は、基本的にプレイヤーにビューをバインドするバックグラウンドスレッドを使用して、このような何か:

UIImageView* imageView; //the view that gets updated 

int current_selected_image_index = 0; 
float time_for_next_image = 0.0; 

AVAudioPlayer* audioPlayer; 

NSArray* image_times; //an array of float values representing each 
         //time when the view should update 

NSArray* image_names; //an array of the image file names 

-(void)update_view 
{ 
    UIImage* next_image_to_play = [image_names objectAtIndex:current_selected_image_index]; 
    imageView.image = next_image_to_play; 
} 

-(void)bind_view_to_audioplayer 
{ 
    while(audioPlayer.isPlaying) 
    { 
     float currentPlayingTime = (float)audioPlayer.currentTime; 
     if(currentPlayingTime >= time_for_next_image) 
     { 
      current_selected_image_index++; 
      [self performSelectorOnMainThread:@selector(update_view) withObject:nil waitUntilDone:NO]; 
      time_for_next_image = [image_times objectAtIndex:[current_selected_image_index+1)]; 
     } 
     [NSThread sleep:0.2]; 
    } 
} 

-(void)init_audio 
{ 
current_selected_image_index = 0; 
time_for_next_image = [image_times objectAtIndex:1]; 
} 

-(void)play_audio 
{ 
    [audioPlayer play]; 
    [self performSelectorInBackground:@selector(bind_view_to_audioplayer) withObject:nil]; 
} 

-(void)pause_audio 
{ 
    [audioPlayer pause]; 
    //that's all, the background thread exits because audioPlayer.isPlaying == NO 
    //the value of current_selected_image_index stays where it is, so [self play_audio] picks up 
    //where it left off. 
} 

また、audioplayerの再生が終了したときにリセットするaudioPlayerDidFinishPlaying:successfully:通知のオブザーバーとしての自己を追加します。