我试图在按下时更改UIButton的颜色。该按钮触发了AVAudioPlayer,我试图使按钮的颜色保持不变,直到声音播放完毕,然后恢复为原始颜色为止。我所拥有的代码一旦按下便会更改按钮的颜色,并在完成声音后保持更改后的颜色,但在播放器不播放时不会恢复原样。
@IBAction func soundPlay(_ sender: UIButton) {
soundPlayer?.play()
if (soundPlayer!.isPlaying == true) {
playButton.backgroundColor = orangeColorLight
}
else {
playButton.backgroundColor = orangeColor
}
}
根据评论中的建议,我试图实现一个audioPlayerDidFinishPlaying委托,但没有成功。不幸的是,关于如何正确实现这一点的文档很少,因此几乎是猜测工作。
@IBAction func soundPlay(_ sender: UIButton) {
playButton.backgroundColor = orangeColorLight
soundPlayer?.play()
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer,
successfully flag: Bool){
playButton.backgroundColor = orangeColor
}
}
我上面的逻辑是在按下按钮时设置较浅的颜色>播放声音>使用audioPlayerDidFinishPlaying观看声音以完成播放>改回颜色。
当您说play
时,您知道声音播放器正在播放,因此没有任何条件跟进。只需更改播放按钮的颜色即可。
您的代码现在为结束。当我们等待声音结束时,不仅要坐在那里观看。没有等待iOS代码之类的东西。 (嗯,在极端情况下有某种情况,但现在不要紧。)您需要的是声音结束时由声音播放器call back。
嗯,你可以做到的!将自己设置为播放器的delegate并实现此委托方法:
声音结束时会被调用,现在您可以根据需要再次设置颜色。
我刚刚向您展示的内容是您需要在iOS编程中理解的关键概念。您的代码是事件驱动。它不会停下来等待事情;相反,只要发生您感兴趣的事情,您就需要安排收听。可可提供各种活动来告诉您各种各样的事情;您的工作将使用正确的名称在正确的位置放置正确的代码,以便在发生感兴趣的事情时调用您的代码is。