SpeechUtterance не останавливается

У меня есть представление коллекции с включенным подкачкой страниц. Я использую AVSpeechSynthesizer для преобразования текста в речь в ячейках представления коллекции. Я хочу, чтобы голос остановился, когда я проведу от одной клетки к другой. Прямо сейчас я вызываю функцию stopSpeech, которая объявлена ​​в классе ячейки.

//Cell Class
import UIKit
import AVFoundation

class DetailArticleCell: UICollectionViewCell, AVSpeechSynthesizerDelegate {
    @IBOutlet weak var articleImage: UIImageView!
    @IBOutlet weak var articleText: UILabel!
    @IBOutlet weak var textToSpeechBGView: UIVisualEffectView!
    @IBOutlet weak var textToSpeechButton: UIButton!
    var isSpeaking: Bool = true
    let speechSynthesizer = AVSpeechSynthesizer()
    var speechText: String!

    override func awakeFromNib() {
        textToSpeechBGView.layer.cornerRadius = 0.5 * textToSpeechBGView.bounds.size.width
        textToSpeechBGView.clipsToBounds = true
        setImageForTextSpeech()
        speechSynthesizer.delegate = self

    }

    func setImageForTextSpeech(){
        isSpeaking ? textToSpeechButton.setImage(#imageLiteral(resourceName: "noAudio"), for: .normal) : textToSpeechButton.setImage(#imageLiteral(resourceName: "audio"), for: .normal)
    }

    func receive(text: String) -> String{
        return text
    }
    func speak(text: String){
        let speechUtterance = AVSpeechUtterance(string: text)
       // speechUtterance.rate = 1.0
        speechSynthesizer.speak(speechUtterance)
        isSpeaking = false
    }
    func stopSpeech(){
      speechSynthesizer.stopSpeaking(at: .immediate)
      isSpeaking = true
    }

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
        isSpeaking = true
        setImageForTextSpeech()
    }


    @IBAction func textToSpeechAction(_ sender: Any) {
        print("clicked")

        if isSpeaking {
            guard let textContent = speechText else {
                speak(text: "")
                return
            }
            speak(text: textContent)

        } else {
            stopSpeech()
        }
        setImageForTextSpeech()
    }


}

Затем я вызываю функцию в методе didEndDisplayingCell из collectionView.

func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    let cell=collectionView.dequeueReusableCell(withReuseIdentifier: "detailArticleCell", for: indexPath) as! DetailArticleCell  
    cell.stopSpeech()
}

Это работает только на каждой третьей ячейке. Но я хочу, чтобы голос остановился, когда пользователь каждый раз переходит к следующей ячейке.

1 ответ

Измените эту строку:

let cell=collectionView.dequeueReusableCell(withReuseIdentifier: "detailArticleCell", for: indexPath) as! DetailArticleCell  

чтобы:

if let detailCell = cell as? DetailArticleCell
{
     detailCell.stopSpeech()
}

и посмотрим, что получится.

Этот метод делегата уже предоставляет параметр с ячейкой, которая больше не отображается, поэтому нет необходимости вызывать dequeueReusableCell (что может дать вам что-то неожиданное).

Другие вопросы по тегам