swift: 递归动画
swift: recursive animation
在我的应用程序中,我想为一组字符串设置动画以向用户提供一些说明。我的期望是第一个字符串淡入,保持几秒钟然后淡出,然后从数组中删除第一个字符串,然后显示下一个字符串,依此类推,直到数组变空。我的实现有问题,但是很难调试(似乎程序不会逐行执行),这是我的代码:
var text = [Text.text1, Text.text2]
@IBOutlet weak var paragraph: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
paragraph.alpha = 0
showText(text: text)
}
private func showText(text: [String]) {
if text.first == nil {
return
} else {
paragraph.text = text.first
UIView.animate(withDuration: 1.5, delay: 1.5, options: .curveEaseInOut, animations: {
self.paragraph.alpha = 1
}, completion: { (_) in
UIView.animate(withDuration: 1.5, delay: 0.5, options: .curveEaseInOut, animations: {
self.paragraph.alpha = 0
}, completion: { (_) in
self.text.remove(at: 0)
self.showText(text: text)
})
})
}
}
问题是第一个字符串显示了 3 次,然后出现索引超出范围错误。当我尝试设置断点并单击 step over 时,它会跳过动画和完成块,而且我不知道如何调试以块作为参数的函数。而且即使我有
paragraph.text = text.first
第一轮过后,paragraph.text
已经是第二串了,但还是显示第一串。
同样,我的终止条件似乎不起作用:经过两次迭代,我注意到 self.text
数组的计数已变为 0,但函数没有 return,它转到 else ...
if text.count == 0 {
return
} else { ... }
我是新手,不知道如何调试块...
问题很微妙,都在第二个完成块中。你有:
self.text.remove(at: 0)
self.showText(text: text)
您更新了 text
属性 但您随后传递了未更改的本地 text
参数。
更改第 2 行以传递 self.text
而不是仅传递 text
。
但是在 showText
中引用 self.text
甚至不需要 text
参数。要么写 showText
只使用 class 的 text
属性 或者更好,只引用 text
参数。后者的优点是不修改 属性.
要实现后一个选项,请将第二个完成块中的两行更改为:
self.text.remove(at: 0)
self.showText(text: text)
只是:
self.showText(text: Array(text[1...]))
在我的应用程序中,我想为一组字符串设置动画以向用户提供一些说明。我的期望是第一个字符串淡入,保持几秒钟然后淡出,然后从数组中删除第一个字符串,然后显示下一个字符串,依此类推,直到数组变空。我的实现有问题,但是很难调试(似乎程序不会逐行执行),这是我的代码:
var text = [Text.text1, Text.text2]
@IBOutlet weak var paragraph: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
paragraph.alpha = 0
showText(text: text)
}
private func showText(text: [String]) {
if text.first == nil {
return
} else {
paragraph.text = text.first
UIView.animate(withDuration: 1.5, delay: 1.5, options: .curveEaseInOut, animations: {
self.paragraph.alpha = 1
}, completion: { (_) in
UIView.animate(withDuration: 1.5, delay: 0.5, options: .curveEaseInOut, animations: {
self.paragraph.alpha = 0
}, completion: { (_) in
self.text.remove(at: 0)
self.showText(text: text)
})
})
}
}
问题是第一个字符串显示了 3 次,然后出现索引超出范围错误。当我尝试设置断点并单击 step over 时,它会跳过动画和完成块,而且我不知道如何调试以块作为参数的函数。而且即使我有
paragraph.text = text.first
第一轮过后,paragraph.text
已经是第二串了,但还是显示第一串。
同样,我的终止条件似乎不起作用:经过两次迭代,我注意到 self.text
数组的计数已变为 0,但函数没有 return,它转到 else ...
if text.count == 0 {
return
} else { ... }
我是新手,不知道如何调试块...
问题很微妙,都在第二个完成块中。你有:
self.text.remove(at: 0)
self.showText(text: text)
您更新了 text
属性 但您随后传递了未更改的本地 text
参数。
更改第 2 行以传递 self.text
而不是仅传递 text
。
但是在 showText
中引用 self.text
甚至不需要 text
参数。要么写 showText
只使用 class 的 text
属性 或者更好,只引用 text
参数。后者的优点是不修改 属性.
要实现后一个选项,请将第二个完成块中的两行更改为:
self.text.remove(at: 0)
self.showText(text: text)
只是:
self.showText(text: Array(text[1...]))