在不将第一次执行延迟指定的时间之后

时间:2018-12-30 23:53:04

标签: ios swift animation uitextview grand-central-dispatch

我正在尝试使textview动画化,以使字符串字符一个一个地出现,然后在0.5秒的延迟后从第一个字符开始一个一个地消失。

我很亲密,我唯一的问题是,第一个字符会立即被删除,就好像它从未出现过一样。任何想法,这是我的功能:

extension UITextView {

    func animate(newText: String) {

        DispatchQueue.main.async {

            self.text = ""

            for (index, character) in newText.enumerated() {
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 * Double(index)) {
                    self.text?.append(character)
                }

                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5 * Double(index)) {
                    self.text?.remove(at: newText.startIndex)
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于第一个字符的索引为0,所以延迟为.now() + 0.5 * 0,简化为.now()

为延迟添加常量:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5 * Double(index) + 0.5) {
                                                                    ^^^^^^

这将导致第一个字符在1秒后消失。

或者:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5 * Double(index + 1)) {

此外,如果您的文本较长,则在此处使用Timer可能更合适,因为Rob在注释中说了几句。

var index = 0
let characterArray = Array(newText)

Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
    textView.text! += "\(characterArray[index])"
    index += 1
    if index == characterArray.endIndex {
        timer.invalidate()
    }
}