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

时间:2018-03-15 09:15:12

标签: ios swift uitableview uiscrollview

enter image description here

如何逐个单元自动滚动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对我来说会更好。

1 个答案:

答案 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并开始播放第一个。一旦完成,代理将被通知,我们增加索引并开始播放下一个索引,依此类推,直到用户取消它或我们的单元格用完为止。