Ios 如何在每个动画的animateWithDuration与repeat之间更改UILabel的文本?
我有一个Ios 如何在每个动画的animateWithDuration与repeat之间更改UILabel的文本?,ios,cocoa-touch,swift,Ios,Cocoa Touch,Swift,我有一个数组单词包含[“爱丽丝”、“鲍勃”、“查尔斯”]和一个UILabel标签。我希望标签反复淡入淡出,每次都使用与单词不同的单词。如果我将文本更改代码放在动画块中,它不会执行,即使淡入效果与预期一样(只有当有东西停止重复时,完成块才会运行): 解决这个问题的好方法是什么?谢谢。您可以将其构造为关键帧动画。这样,您可以将三个动画链接在一起(每个单词一个)并重复整个链接 或者(这是我可能会做的),将一个动画放入它自己的方法中,在完成块中,添加一个短延迟并调用该方法-从而创建一个永久循环。循环会创
数组
单词
包含[“爱丽丝”、“鲍勃”、“查尔斯”]
和一个UILabel
标签。我希望标签
反复淡入淡出,每次都使用与单词
不同的单词。如果我将文本更改代码放在动画
块中,它不会执行,即使淡入效果与预期一样(只有当有东西停止重复时,完成
块才会运行):
解决这个问题的好方法是什么?谢谢。您可以将其构造为关键帧动画。这样,您可以将三个动画链接在一起(每个单词一个)并重复整个链接
或者(这是我可能会做的),将一个动画放入它自己的方法中,在完成块中,添加一个短延迟并调用该方法-从而创建一个永久循环。循环会创建重复,但每个动画都只是一个动画,因此现在可以在连续调用时遍历数组。因此结构(伪代码)如下所示:
func animate() {
let opts = UIViewAnimationOptions.Autoreverse
UIView.animateWithDuration(1, delay: 0, options: opts, animations: {
// animate one fade in and out
}, completion: {
_ in
delay(0.1) {
// set the next text
self.animate() // recurse after delay
}
})
}
可以将其构造为关键帧动画。这样,您可以将三个动画链接在一起(每个单词一个)并重复整个链接
或者(这是我可能会做的),将一个动画放入它自己的方法中,在完成块中,添加一个短延迟并调用该方法-从而创建一个永久循环。循环会创建重复,但每个动画都只是一个动画,因此现在可以在连续调用时遍历数组。因此结构(伪代码)如下所示:
func animate() {
let opts = UIViewAnimationOptions.Autoreverse
UIView.animateWithDuration(1, delay: 0, options: opts, animations: {
// animate one fade in and out
}, completion: {
_ in
delay(0.1) {
// set the next text
self.animate() // recurse after delay
}
})
}
当然不是最优雅但最有效的解决方案:
@IBOutlet weak var label: UILabel!
let words = ["Is", "this", "what", "you", "want?"]
var currentIndex = -1
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
showNextWord()
}
func showNextWord() {
if currentIndex == words.count - 1 {
currentIndex = -1
}
UIView.animateWithDuration(1, delay: 1, options: UIViewAnimationOptions(0), animations: { () -> Void in
self.label.alpha = 0.0
}) { (_) -> Void in
self.label.text = self.words[++self.currentIndex]
UIView.animateWithDuration(1, animations: { () -> Void in
self.label.alpha = 1.0
}, completion: { (_) -> Void in
self.showNextWord()
})
}
}
当然不是最优雅但最有效的解决方案:
@IBOutlet weak var label: UILabel!
let words = ["Is", "this", "what", "you", "want?"]
var currentIndex = -1
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
showNextWord()
}
func showNextWord() {
if currentIndex == words.count - 1 {
currentIndex = -1
}
UIView.animateWithDuration(1, delay: 1, options: UIViewAnimationOptions(0), animations: { () -> Void in
self.label.alpha = 0.0
}) { (_) -> Void in
self.label.text = self.words[++self.currentIndex]
UIView.animateWithDuration(1, animations: { () -> Void in
self.label.alpha = 1.0
}, completion: { (_) -> Void in
self.showNextWord()
})
}
}
当我切换到另一个视图控制器时,递归会一直持续下去,为了防止出现这种情况,我检查了在completion
中提供给我们的completed
在递归之前是否为真。否则,这将非常有效。谢谢。但是在completetion操作中没有给出完整的布尔值……你是在说自己的值吗?当我切换到另一个视图控制器时,递归会一直持续下去,为了防止出现这种情况,我检查了在completion
中给我们的completed
在递归之前是否为真。否则,这将非常有效。谢谢。但是在completetion操作中没有给出完整的布尔值……你是在说自己的值吗?