所以我的情况是我想要循环声音并逐渐减少声音之间的延迟。手段,声音应该随着时间的推移而最常播放。
现在,我正在使用AVAudioPlayer,声音持续时间为1秒,但实际声音仅持续0.5秒。另外0.5秒的声音被静音了。因此,当我使用numberOfLoops
属性并将其设置为-1(无限重复)并结合AVAudioPlayer上的rate
属性并将其更改为高于1的某个值时,我得到了所需的结果...仍然,这不是那么理想,因为声音可能会失真(因为音调)。
我正在寻找像SpriteKit中的SKAction这样的东西,我可以在一定的延迟后运行一段代码......在UIKit中这样做的最佳方法是什么?
答案 0 :(得分:0)
要在UIKit中遇到一段延迟后运行一段代码,一种方法是使用GCD,即dispatch_after。
- (void)myMethod {
__weak __typeof__(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.dispatchInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (weakSelf.isRunning){
[weakSelf myMethod];
}
});
// Code to play audio here
}
这里,dispatchInterval
是一个浮点数,表示循环重复之前的秒数。因此,只需更新dispatchInterval
以减少每次触发时的循环长度。要启动循环,只需将isRunning
设置为YES并调用myMethod,即可停止循环,只需将isRunning
设置为NO即可。这种方法避免了必须使用NSTimer,这可能会导致保留对自我的强引用的问题。