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操作中没有给出完整的布尔值……你是在说自己的值吗?