如何逐个单元格地自动滚动 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:如何在不修改其输入值的情况下跨多个单元格更改公式?