如何逐个单元自动滚动UITableView 嗯,我认为这很容易实现,而且我做得非常接近
这是我在
中的ViewController中的 SPEECH 功能
var myUtterance = AVSpeechUtterance(string: "")
let speecher = AVSpeechSynthesizer()
func speechWord(word: String){
DispatchQueue.main.async {
self.speecher.stopSpeaking(at: AVSpeechBoundary.immediate)
self.myUtterance = AVSpeechUtterance(string: word)
self.myUtterance.voice = AVSpeechSynthesisVoice(language: "en-US")
self.myUtterance.rate = 0.5
self.speecher.speak(self.myUtterance)
}
}
这是我在
中的ViewController中的 AutoSpeech 功能
func startAutoSpeechList(row: Int){
let indexPath = IndexPath(row: row, section: 0)
print(indexPath)
myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .top) //Select
myTableView.scrollToNearestSelectedRow(at: .top, animated: true) //Scroll
let cell = tableView(myTableView, cellForRowAt: indexPath) as! WordTableViewCell
self.speechWord(word: cell.spell.text!) //Speech
}
(方法1 )这是我用来激活AutoSpeech功能的按钮
var row = 0
@IBAction func myAutoButton(_ sender: UIBarButtonItem) {
self.startAutoSpeechList(row: row)
row += 1
}
方法1,查看我上传的图片当我第一次点击AutoButton时,它会跳转到屏幕A.然后我再次点击AutoSpeech按钮,它再转到屏幕B.然后我点击AutoButton第三次,它跳到屏幕C。
(方法2 )这是我用来激活AutoSpeech功能的按钮
@IBAction func myAutoButton(_ sender: UIBarButtonItem) {
for myRow in 0..<3{
self.startAutoSpeechList(row: myRow)
}
}
方法2,当我点击AutoSpeech按钮时,它会立即跳转到屏幕C ,而无需随时停留屏幕A,B。你能解释为什么它会立即逃离Scree A,B吗?
是否方法3 帮助我实现点击时 AutoSpeech按钮,它将跳转到屏幕A并发出单词 &#34; cat&#34;,然后在完成发音和发音后跳到B. &#34;狗&#34;然后跳到 C等等...... 。谁能帮助我实现方法3? Swift 4对我来说会更好。
答案 0 :(得分:1)
您的方法2代码是您所需要的,但它会连续运行并在几毫秒内完成。
可用的最佳选择是使用AVSpeechSynthesizerDelegate方法监控完成演讲。
在您的情况下,您可以使用
func speechSynthesizer(AVSpeechSynthesizer, didFinish: AVSpeechUtterance)
当正在播放的演讲结束播放时通知。调用此函数后,您可以调用speakNextRow之类的函数或移动到列表中的下一个函数。
粗略地说,这是你应该做的事情。 (未在xcode中测试,用作如何做你需要的指南)。
class ViewController: UIViewController, AVSpeechSynthesizerDelegate {
var currentSelectedRow: Int?
var isAutoPlaying = false
var myUtterance = AVSpeechUtterance(string: "")
let speecher = AVSpeechSynthesizer()
override func viewDidLoad() {
super.viewDidLoad()
self.speecher.delegate = self
}
func speechWord(word: String){
DispatchQueue.main.async {
self.speecher.stopSpeaking(at: AVSpeechBoundary.immediate)
self.myUtterance = AVSpeechUtterance(string: word)
self.myUtterance.voice = AVSpeechSynthesisVoice(language: "en-US")
self.myUtterance.rate = 0.5
self.speecher.speak(self.myUtterance)
}
}
func startAutoPlay() {
isAutoPlaying = true
currentSelectedRow = 0
scrollToAndSpeak(at: currentSelectedRow)
}
func scrollToAndSpeak(at index: Int) {
// make sure to check not going out of bounds!!
let indexPath = IndexPath(row: index, section: 0)
myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .top) //Select
myTableView.scrollToNearestSelectedRow(at: .top, animated: true) //Scroll
let cell = tableView(myTableView, cellForRowAt: indexPath) as! WordTableViewCell
self.speechWord(word: cell.spell.text!) //Speech
}
func speechSynthesizer(AVSpeechSynthesizer, didFinish: AVSpeechUtterance) {
if isAutoPlaying {
// make sure to check not going out of bounds!!
currentSelectedRow = (currentSelectedRow ?? 0) + 1
scrollToAndSpeak(at: currentSelectedRow)
}
}
}
因此,当您选择自动播放时,将标志isAutoPlaying转为true并开始播放第一个。一旦完成,代理将被通知,我们增加索引并开始播放下一个索引,依此类推,直到用户取消它或我们的单元格用完为止。