ios - 如果以模态方式呈现另一个视图,则继续播放 AVSpeechSynthesizer
问题描述
我正在尝试在 swift/xcode 中使用 AVSpeechSynthesizer 来读出一些文本。我大部分时间都在工作。我已经设置好了,如果他们回到上一个屏幕或下一个屏幕,音频就会停止。但在我的例子中,如果以模态方式呈现另一种观点,我希望演讲继续进行。例如,我有一个退出按钮,点击后会显示“您确定要退出吗?y/n”类型的屏幕,但我希望音频继续播放,直到他们点击“是”并被带走。我还有另一种可以模态呈现的观点,如果是这种情况,我希望音频继续。
有没有人知道如何在视图以模态方式呈现在顶部时保持语音播放但在完全导航到另一个视图时停止播放?
到目前为止,这是我的代码:
//Press Play/Pause Button
@IBAction func playPauseButtonAction(_ sender: Any) {
if(isPlaying){
//pause
synthesizer.pauseSpeaking(at: AVSpeechBoundary.immediate)
playPauseButton.setTitle("Play", for: .normal)
} else {
if(synthesizer.isPaused){
//resume playing
synthesizer.continueSpeaking()
} else {
//start playing
theUtterance = AVSpeechUtterance(string: audioTextLabel.text!)
theUtterance.voice = AVSpeechSynthesisVoice(language: "en-UK")
synthesizer.speak(theUtterance)
}
playPauseButton.setTitle("Pause", for: .normal)
}
isPlaying = !isPlaying
}
//Press Stop Button
@IBAction func stopButtonAction(_ sender: Any) {
if(isPlaying){
//stop
synthesizer.stopSpeaking(at: AVSpeechBoundary.immediate)
playPauseButton.setTitle("Play", for: .normal)
isPlaying = !isPlaying
}
}
//Leave Page
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
synthesizer.stopSpeaking(at: .immediate)
}
解决方案
问题出在你的viewWillDisappear
. 任何类型的新屏幕都会触发此操作,因此您的代码确实synthesizer.stopSpeaking(at: .immediate)
会被调用,从而停止您的音频。这包括演示或推送新控制器。
现在,如何改进呢?你提到过这个:
我已经设置好了,如果他们返回上一个屏幕或下一个屏幕,音频将停止
首先,如果他们返回上一个屏幕:
您希望在
deinit { }
方法中执行相同的音频代码行停止。这会让您知道您的屏幕或控制器正在从内存中删除,这意味着控制器已在您的控制器堆栈中消失(用户返回到上一个屏幕)。只要您没有保留周期计数问题,这应该可以 100% 正常工作。
接下来,到下一个屏幕,您可以轻松地在函数中包含停止音频的相同代码行以推送新屏幕。
推荐阅读
- ansible - 在“vars”部分使用 {{ item }} 时,Ansible“项目未定义”
- python - UnicodeDecodeError:“utf-8”编解码器无法解码位置 398 中的字节 0xff:无效起始字节 || 为所有人预订python
- node.js - 对于后端 NodeJS 应用程序,我是否应该跳过 AWS CodePipeline 上的构建阶段
- html - 如何进行过滤映射
- java - Glogg - 在 Java 中是相似的是可能的或任何 Java 替代品
- sql - 查询两个数字是否共享前 n 位数字(以另一个数字开头)
- reactjs - 如何使用微调器显示叠加层将页面加载到 React JS 中
- java - 如何使用Java字符串replaceAll将字符串中所有出现的“替换为\”
- python - 在 docker 上运行 django+nginx+celery+gunicorn+daphne
- git - 我们能否提供对文件的分支级别访问权限,即甚至可以在 codecommit 门户中查看文件