0

我对 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];
}
4

3 回答 3

1

首先,我假设在您的问题标题中带有“之后”的意思是“之前”。

但是,我认为您的问题与该sleep()功能的使用有关。它的问题在于它会在您指定的时间内阻止执行。iOS 中的所有 UI 修改(包括对背景颜色的修改)都不会立即执行,而是在您将控制权返回给当前 RunLoop 时执行(粗略地说,只是为了让您理解:在您的方法返回后的某个时间)。通过使用睡眠,您会延迟每次更新,这会导致问题。一般来说,睡眠不是你想要使用的,因为你真的不想阻止执行!

我建议你摆脱睡眠并使用 - 例如 - NSTimers:它们不会阻止任何东西。或者,您可以将注意力转向AVAudioPlayer(如 John Woods 所说)的委托机制,以便在您完成演奏时重置背景颜色。

于 2013-08-23T17:20:32.593 回答
0

做你想做的事情的最好方法是让你的班级成为 AVAudioPlayerDelegate 并使用

audioPlayerDidFinishPlaying:successfully:

当播放器完成时,系统会自动调用该方法。它将为您提供最可靠和最有效的整体性能。

于 2013-08-22T09:38:36.000 回答
0

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

您可以设置通知中心..它会在歌曲播放完毕后触发...“itemDidFinishPlaying”是您要调用的方法...songItem是AVPlayerItem..

于 2013-08-22T09:51:19.953 回答