如何逐个单元格地自动滚动 UITableView

Posted

技术标签:

【中文标题】如何逐个单元格地自动滚动 UITableView【英文标题】:How to Scroll UITableView Automatically cell by cell 【发布时间】:2018-03-15 09:15:11 【问题描述】:

如何自动逐个单元格滚动 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

(方法一) 这是我用来激活自动语音功能的按钮

var row = 0
@IBAction func myAutoButton(_ sender: UIBarButtonItem) 
    self.startAutoSpeechList(row: row)
    row += 1

方法一,看我上传的图片 当我第一次点击AutoButton时,它跳转到屏幕A。我再次点击AutoSpeech按钮,它到屏幕B。然后我点击AutoButton第三次跳转到C屏。

(方法二) 这是我用来激活自动语音功能的按钮

@IBAction func myAutoButton(_ sender: UIBarButtonItem) 
    for myRow in 0..<3
        self.startAutoSpeechList(row: myRow)
    

方法2,当我点击自动语音按钮时,它立即跳转到屏幕C,而不会停留屏幕A,B。你能解释一下为什么它会立即逃离 Scree A、B 吗?

是否有方法3可以帮助我实现这一点当我点击 AutoSpeech 按钮,它将跳转到屏幕 A 并发音该单词 "cat",读完后跳到B “狗”,然后跳转到 C,等等……。谁能帮我实现方法3? Swift 4 对我来说会更好。

【问题讨论】:

方法 2 看起来完全符合您的要求,只需几毫秒即可完成。您要么需要一个计时器来控制行之间的时间,要么您需要知道每个人何时完成演讲,以便您可以进入下一个 方法2的问题是直接跳转到C屏,没有停留在A、B屏,请问如何解决 我知道,这就是我在评论中所说的?修复也建议在上面的评论中 有什么方法可以观察是否播放完语音? 【参考方案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 并开始播放第一个。一旦完成,代理将收到通知,我们增加索引并开始播放下一个,依此类推,直到用户取消它或我们用完单元格。

【讨论】:

我已经测试了你的答案,它对我有用。谢谢你的帮助。我认为speechSynthesizer这个函数对于观察它是否已经完成语音是必要的。

以上是关于如何逐个单元格地自动滚动 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

如何解决滚动具有自定义单元格的 UITableview 的崩溃?

Excel 2010:如何在不修改其输入值的情况下跨多个单元格更改公式?

滚动会弄乱 UITableView 中的自定义单元格

如何阻止 UITableview 一次滚动多个单元格

uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容

如何在键盘上方滚动自定义 UITextField 单元格