我遇到了AVAudioPlayer的问题。 我想在声音播放之前为UICollectionView的单元格着色,但是使用此代码我无法执行此操作。
我认为改变背景的操作比播放声音的指令慢,因此单元格不会改变背景颜色。
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];
}
答案 0 :(得分:1)
首先,我假设在你的问题的标题中,“之后”你的意思是“之前”。
但是,我认为您的问题与使用sleep()
功能有关。它的问题是它会阻止你指定的时间执行。 iOS中的所有UI修改(包括背景颜色中的一个)都不会立即执行,但是当您将控制权返回到当前的RunLoop时(粗略地说,只是为了让您理解:在您的方法返回后的某个时间) )。通过使用睡眠,您将延迟每次更新,这会导致问题。
一般来说,睡眠不是你想要使用的,因为你真的不想阻止执行!
我建议你摆脱睡眠并使用 - 例如 - NSTimer
s:它们不会阻挡任何东西。或者,您可以将注意力转移到AVAudioPlayer
(如John Woods所说)的委托机制,以便在您完成游戏后重置背景颜色。
答案 1 :(得分:0)
做你想做的事情的最好方法是让你的班级成为AVAudioPlayerDelegate并使用
audioPlayerDidFinishPlaying:successfully:
当玩家完成时,系统会自动调用该方法。它将为您提供最可靠,最高效的整体性能。
答案 2 :(得分:0)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying)name:AVPlayerItemDidPlayToEndTimeNotification object:songItem];
你可以设置Notification Center ..在Song完成播放后会激活...“itemDidFinishPlaying”是你要调用的方法... songItem是AVPlayerItem ..