2013-08-22 34 views
0

我有AVAudioPlayer的問題。 我想在播放聲音之前給UICollectionView的一個單元着色,但是使用這段代碼我無法做到這一點。在AVAudioPlayer播放前做點什麼

我認爲改變背景的操作比播放聲音的指令更慢,因此單元不會改變背景顏色。

int randomNumber = (arc4random() % [soundArray count]); 
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[soundArray objectAtIndex:randomNumber] error:&error]; 
self.audioPlayer.delegate = self; 
if(!self.audioPlayer){ 
    NSLog(@"Error creating player: %@", error); 
} 
else{ 
    CGColorRef colorRef = [[cellArray objectAtIndex:randomNumber] backgroundColor]; 
    [[cellArray objectAtIndex:randomNumber] setBackgroundColor:(__bridge CGColorRef)([UIColor blackColor])]; 

    [self.audioPlayer play]; 
    sleep([self.audioPlayer duration]); 

    [[cellArray objectAtIndex:randomNumber] setBackgroundColor:colorRef]; 
} 

回答

1

首先我的假設你的問題的標題與「之後」的意思是「之前」。

但是,我認爲你的問題與使用sleep()函數有關。問題在於它會阻止執行達到您指定的時間。 iOS中的所有UI修改(包括背景顏色的修改)都不會立即執行,但是當您將控制返回到當前的RunLoop時(爲了讓您明白:在您的方法返回之後的某個時間) 。通過使用睡眠你會延遲每一次更新,這會導致問題。 睡眠不是你想要使用的,一般來說,因爲你真的不想阻止執行!

我建議你擺脫睡眠並使用 - 例如 - NSTimer s代替:它們不會阻塞任何東西。或者,您可以將注意力轉向AVAudioPlayer的代理機制(如John Woods所說),以便在完成演奏時重置背景顏色。

0

做你想做什麼,最好的辦法是讓你的類的AVAudioPlayerDelegate和使用

audioPlayerDidFinishPlaying:successfully: 

這種方法是由系統權當玩家完成自動調用。它將爲您提供最可靠和最高效的整體表現。

+0

我的問題是播放指令之前的操作。播放指令後的操作正確。 – zp26

0

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying)name:AVPlayerItemDidPlayToEndTimeNotification object:songItem];

您可以設置通知Center..it將火宋完成打......「itemDidFinishPlaying」後,你要調用的方法... songItem是AVPlayerItem ..