我希望我的图像视图随着str中的每个句子而改变,但它不会改变
let elements = ["1","2","3"]
var cx = 0
for str in components{
OutImage.image = UIImage(named: elements1[cx+1])
myUtterance = AVSpeechUtterance(string: str)
myUtterance.rate = 0.4
myUtterance.pitchMultiplier = 1.3
myUtterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
myUtterance.voice = voiceToUse
synth.speak(myUtterance)
}
答案 0 :(得分:0)
你不能在for循环中这样做,因为speak
是异步的,这意味着它将在" parallel"中执行。与你的其余代码。当你的for循环结束时,语音合成器可能甚至没有开始合成你的第一句话!
解决方案是使用AVSpeechSynthesizerDelegate
。特别是,您需要实现此方法:
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
didFinish utterance: AVSpeechUtterance)
当合成器完成发声时,将调用此委托方法。
在该方法中,您可以通过查看cx
变量来确定应显示哪个图像。然后你应该增加cx
。之后,使用cx
,使用下一个话语并拨打speak
。您还应该记得检查cx
是否是数组的结尾!