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
(что может дать вам что-то неожиданное).