检索下一个文本时,逐个字母的字符串动画会混淆



我有一个弹出窗口,应该通过逐个字母的动画显示用户说明。问题是每当用户单击"下一步"时,字母就会与以前的文本混淆。

动画代码:

extension UILabel {
func animate(newText: String, characterDelay: TimeInterval) {
DispatchQueue.main.async {
self.text = ""
for (index, character) in newText.enumerated() {
DispatchQueue.main.asyncAfter(deadline: .now() + characterDelay * Double(index)) {
self.text?.append(character)
}
}
}
}

按钮操作/调用方法(如您所见,每次用户单击"下一步"时我都尝试清空变量,但没有成功)

@IBAction func nextbtt(_ sender: Any) {
var instructions = ["text"]
counter = counter + 1
var w1 = " لكن الوصول إليه يتطلب مواجهة وحل تحديات مختلفة"
var w2 = "هل بإمكانك مساعدتي  في الحصول على الكنز؟"
let userId = UserDefaults.standard.object(forKey: "userId") as? String
ref = Database.database().reference()
let  userLang = ref.child("users").child(userId!).child("lang")
userLang.observeSingleEvent(of: .value, with: { (snapshot) in
let lang = snapshot.value as? Int
if(lang==1){
////////////// if user's langague is English
w1 = "But finding it requires confronting and solving different challenges"
w2 = " Could you help me in getting the treasure"            }
instructions.append(w1)
instructions.append(w2)
if(self.intrCounter < 3){
self.mytext.text = ""
var new = instructions[self.intrCounter]
self.mytext.text = new
self.mytext.animate(newText: new ?? "May the source be with you", characterDelay: 0.1)
self.intrCounter = self.intrCounter + 1
if(self.intrCounter == 3){
if(lang==1){
(sender as AnyObject).setBackgroundImage(UIImage(named: "engready"), for: UIControl.State.normal)
}
else {
(sender as AnyObject).setBackgroundImage(UIImage(named: "ready"), for: UIControl.State.normal)}
}
}
else{
}
})
if ( counter == 4){
status[0] = true
popUp.removeFromSuperview()
}
}

截图:

一:向用户显示文本,用户单击动画中间的"下一步">

二:当用户在文本 1 完成之前单击"下一步"时 法典:

出现此问题的原因是您正在为每个字符调用异步块,并且可能每个字符都需要另外一段时间。 只是为了测试这个,尝试这个更改,如果它有助于相应地更改代码:

var someCounter = 1
extension UILabel {
func animate(newText: String, characterDelay: TimeInterval) {
DispatchQueue.main.async {
self.text = ""
for (index, character) in newText.enumerated() {
someCounter += 1
DispatchQueue.main.asyncAfter(deadline: .now() + 
someCounter + characterDelay * Double(index)) {
self.text?.append(character)
}
}
}
}

让我知道这是否确实是问题所在,如果是,我将上传更优化的代码。

最新更新