【问题标题】:Typing animation: deleting characters打字动画:删除字符
【发布时间】:2016-03-05 21:27:27
【问题描述】:

这是一个打字动画,它以固定的时间间隔将 Array 中的字符添加到文本字段的文本中:

@IBOutlet weak var textFieldMain: UITextField!
var myText = Array("Hi! I'm Cesare.".characters)
var myString = "Hi! I'm Cesare."
var typingAnimationCounter = 0
var typingAnimationTimer: NSTimer?

func fireTimer() {
    typingAnimationTimer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: "typeLetter", userInfo: nil, repeats: true)
}

func typeLetter() {
    if typingAnimationCounter < myText.count {
        textFieldMain.text = textFieldMain.text! + String(myText[typingAnimationCounter])
        typingAnimationTimer?.invalidate()
        typingAnimationTimer = NSTimer.scheduledTimerWithTimeInterval(0.15, target: self, selector: "typeLetter", userInfo: nil, repeats: false)
    } else {
        typingAnimationTimer?.invalidate()
    }
    typingAnimationCounter++
}

我想现在删除 textField 的字符(就像它是一个打字动画,但是通过删除字符)。不过,我不知道怎么做。

func fireDeletionTimer() {
    typingAnimationTimer = NSTimer.scheduledTimerWithTimeInterval(0.45, target: self, selector: "deleteLetter", userInfo: nil, repeats: true)
}

func deleteLetter() {
    if typingAnimationCounter < myText.count - 1 {
        let index = myString.characters.count - typingAnimationCounter - 1
        textFieldMain.text = myString.stringByReplacingOccurrencesOfString(String(myText[index]), withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
        typingAnimationTimer?.invalidate()
        typingAnimationTimer = NSTimer.scheduledTimerWithTimeInterval(0.45, target: self, selector: "deleteLetter", userInfo: nil, repeats: false)
    } else {
        typingAnimationTimer?.invalidate()
    }
    typingAnimationCounter++
}

我想用空字符串替换每个字符,但它不起作用(替换字符串的随机字母)。如何修复我的代码?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    为什么不做以下事情:

    func deleteLetter() {
        if textFieldMain.text != "" {
            textFieldMain.text = str.substringToIndex(textFieldMain.text.endIndex.predecessor())
        } else {
           typingAnimationTimer?.invalidate()
        }
    }
    

    顺便说一句,如果您在 fireDeletionTimer() 中使用“repeats: true”启动计时器,则无需在 deleteLetter() 中一次又一次地重新创建它

    此外,stringByReplacingOccurrencesOfString() 会清除文本中该字母的每个实例,而不仅仅是最后一个。

    【讨论】:

    【解决方案2】:

    我会将deleteLetter() 方法改写成这样:

    func deleteLetter() {
        myString = myString.substringToIndex(myString.endIndex.predecessor())
        textFieldMain.text = myString
    
        typingAnimationTimer?.invalidate()
        if myString.characters.count > 0 {
            typingAnimationTimer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: "deleteLetter", userInfo: nil, repeats: false)
        }
    }
    

    编辑:看起来 Zoltan 已经击败了我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多