1

オーディオファイルの再生、再生/一時停止ボタンを使用AVAudioplayerして再生と一時停止を切り替え、次々と同期します。次々にロードする合計10または11があります。NSTimeraudio playerview controllersview controllers

最初に再生ボタンを押すと、 が起動し、に基づいてNSTimer再生が開始され、View Controller が次々と読み込まれます。一時停止ボタンをもう一度押して再開すると、その時点のオーディオ ファイルからすべてが再開され、一時停止されたのと同じ時点から再開されます。しかし、同時に最初から次々と読み込みを開始するのも良くない。audio fileNSTimerNSTimerview controllersview controllersNSTimer

このステートメントでView Controllerをリロードしています

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

だから私の問題は、view controllers一時停止ボタンをもう一度押して再生を再開するときに、最初からロードを停止する必要があることです。

-(void)playpauseAction:(id)sender 
{ 
    if ([audioPlayer isPlaying]) {
        [sender setImage:[UIImage imageNamed:@"Play Icon.png"] forState:UIControlStateSelected];
        [audioPlayer pause];
        [self pauseTimer];
    } else {
        [sender setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
        [audioPlayer play];
        [self resumeTimer];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:11.0
                                                      target:self
                                                    selector:@selector(displayviewsAction:)
                                                    userInfo:nil
                                                     repeats:NO];
    }       
}

-(void)pauseTimer{
    pauseStart = [[NSDate dateWithTimeIntervalSinceNow:0] retain];
    previousFireDate = [[timer fireDate] retain];
    [timer setFireDate:[NSDate distantFuture]];
}

-(void)resumeTimer{
    float pauseTime = -1*[pauseStart timeIntervalSinceNow];
    [timer setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]];
    [pauseStart release];
    [previousFireDate release];    
}

- (void)displayviewsAction:(id)sender
{  
    First *firstController = [[First alloc] init];
    firstController.view.frame = CGRectMake(0, 0, 320, 480);
    CATransition *transitionAnimation = [CATransition animation];  
    [transitionAnimation setDuration:1];    
    [transitionAnimation setType:kCATransitionFade];    
    [transitionAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];    
    [self.view.layer addAnimation:transitionAnimation forKey:kCATransitionFade];
    [self.view addSubview:firstController.view];
    [self.view addSubview:toolbar];
    [firstController release];   
    self.timer = [NSTimer scheduledTimerWithTimeInterval:23 target:self selector:@selector(Second) userInfo:nil repeats:NO];     
 }

view controllers一時停止ボタンをもう一度押して再生を再開したときに、最初から読み込みを停止する方法について誰か考えを教えてください。

4

1 に答える 1

0

FirstViewControllerオーディオ トラックで 11 秒経過後に表示しようとしているようですね。
タイマーをポーリングするように設定し (0.5 ~ 1.0 秒ごと)、audioPlayer の経過時間が 11.0 を超える場合は、アクションを実行します。

-(void)playpauseAction:(id)sender 
{ 
if ([audioPlayer isPlaying]){
   [sender setImage:[UIImage imageNamed:@"Play Icon.png"] forState:UIControlStateSelected];
   [audioPlayer pause];
   [self.timer invalidate]; // stop the polling timer
} else {
   [sender setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
   [audioPlayer play];
   // start/resume the timer
   self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 /* polling interval */
                                                      target:self
                                                   selector:@selector(tryToDisplayViews:)
                                                    userInfo:nil
                                                     repeats:YES]; /* REPEAT = YES */
}       
}

// the new polled method
-(void)tryToDisplayViews:(id)sender {
    // need last current time as a new variable to ensure that we only add the view once
    // and not every time the method fires with currentTime > 11.0
    if( audioPlayer.currentTime > 11.0 && lastCurrentTime < 11.0) {
        [self displayviewsAction:nil];
    } 
    // you can add the second view here in a similar fashion
    // if(audioPlayer.currentTime > (23.0+11.0) && lastCurrentTime < (23.0+11.0) ) {}

    lastCurrentTime = audioPlayer.currentTime;

}

resumeTimerこれにより/アクションも取り除かれますpauseTimer。一時停止した時間をカウントする必要はありません。

于 2012-06-15T18:56:22.110 に答える