可以在设置音量的时候,使用CATransaction来控制动画效果的执行。在动画完成前,再次调用fadeDuration方法时,可以设置动画的时间为剩余动画时间的比例,使得新的动画能够顺利接替原有的动画。
示例代码如下:
let player = AVAudioPlayer(contentsOf: url)
var currentVolume: Float = 1.0
// 使用CATransaction来控制音量变化的动画效果
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
// 设置新的音量
player.volume = newVolume
player.play()
CATransaction.setCompletionBlock({
// 动画执行完成后,更新当前音量
currentVolume = newVolume
})
CATransaction.commit()
// 如果还有剩余的动画时间,再次调用fadeDuration方法时,指定新的动画时间为剩余时间的比例
let remainingTime = duration - CATransaction.currentAnimationDuration()
if remainingTime > 0 {
let proportion = remainingTime / duration
player.setFadeDuration(duration * proportion)
}