延迟显示一个字母

Display letters one at a time with a delay

我试图以 textView 一次一个 延迟 的方式显示字母,但我我无法正确处理。

我想让它看起来像是有人在打字。这是我当前的代码:

let delay = 2.0 * Double(NSEC_PER_SEC)
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

let localmessage = message + "\n"

for letter in localmessage.characters {
        dispatch_after(dispatchTime, dispatch_get_main_queue(), {
            self.textView.text = self.textView.text + String(letter)

        })

   }

您正在使用相同的 dispatchTime,因此所有字符将同时显示。您需要在 for 循环中增加 dispatchTime 以一次显示一个字符。

这样试试:

let localmessage = message + "\n"

var myInt = 1

for letter in localmessage.characters {

    let delay = 2.0 * Double(NSEC_PER_SEC) * Double(myInt)
    let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
        self.textView.text = self.textView.text + String(letter)
    })

    myInt = myInt + 1
}

您可以尝试使用 NSTimer,而不是 GCD:

var index = 0
var timer = NSTimer()

    override func viewDidLoad() {
        super.viewDidLoad()

        timer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(ViewController.updateTextView), userInfo: nil, repeats: true)

    }

    func updateTextView() {

        let letter = localmessage.characters[index]

        self.textView.text = self.textView.text + String(letter)

        index++
        if index == localmessage.characters.count {
           timer.invalidate()
        }

    }

这是我的做法

let message = "hello world"
    var index:Double = 1.0
    let delayInSeconds = 0.5
    for letter in message.characters {
        runAfterDelay(delayInSeconds * index, block: {
            self.firstTextField.text = self.firstTextField.text! + String(letter)
        })
        index = index + 1
    }
}

func runAfterDelay(delay: NSTimeInterval, block: dispatch_block_t) {
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
    dispatch_after(time, dispatch_get_main_queue(), block)
}

事实证明,runAfterDelay 函数在很多情况下都非常方便,因此我喜欢保留它:)

为什么不直接使用定时器?

class ViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!

    let message = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."

    override func viewDidLoad() {
        super.viewDidLoad()
        self.typingTimer()
    }

    func typingTimer() {
        var localMessage = message
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { timer in
            if localMessage.characters.count > 0 {
                self.textView.text.append(localMessage.characters.remove(at: localMessage.characters.startIndex))
            } else {
                timer.invalidate()
            }
        })
    }

}