首页 > 解决方案 > 如果以模态方式呈现另一个视图,则继续播放 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)
}

标签: iosswiftxcode

解决方案


问题出在你的viewWillDisappear. 任何类型的新屏幕都会触发此操作,因此您的代码确实synthesizer.stopSpeaking(at: .immediate)会被调用,从而停止您的音频。这包括演示或推送新控制器。

现在,如何改进呢?你提到过这个:

我已经设置好了,如果他们返回上一个屏幕或下一个屏幕,音频将停止

首先,如果他们返回上一个屏幕

您希望在 deinit { }方法中执行相同的音频代码行停止。这会让您知道您的屏幕或控制器正在从内存中删除,这意味着控制器已在您的控制器堆栈中消失(用户返回到上一个屏幕)。只要您没有保留周期计数问题,这应该可以 100% 正常工作。

接下来,到下一个屏幕,您可以轻松地在函数中包含停止音频的相同代码行以推送新屏幕。


推荐阅读