如何在 animateWithDuration 的每个动画之间重复更改 UILabel 的文本?

Posted

技术标签:

【中文标题】如何在 animateWithDuration 的每个动画之间重复更改 UILabel 的文本?【英文标题】:How do I change the text of a UILabel between each animation of animateWithDuration with repeat? 【发布时间】:2015-04-24 20:31:38 【问题描述】:

我有一个 Array words 包含 ["alice", "bob", "charles"] 和一个 UILabel label。我希望label 反复淡入和淡出,每次都使用与words 不同的词。如果我将文本更改代码放在 animations 块中,它不会执行,即使淡入淡出按预期工作(completion 块仅在停止重复时运行):

label.alpha = 0

UIView.animateWithDuration(4, delay: 0, options: .Autoreverse | .Repeat, animations: 
    self.label.text = nextWord()
    self.label.alpha = 1
, completion: _ in
    NSLog("Completed animation")
)

有什么好的方法可以解决这个问题?谢谢。

【问题讨论】:

【参考方案1】:

肯定不是最优雅但最有效的解决方案:

@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 是否为真。否则,这将完美运行。谢谢。 但是在完成动作中没有给出完整的布尔值......你在谈论自己的价值吗?【参考方案2】:

您可以将其构建为关键帧动画。这样,您可以将三个动画链接在一起(每个单词一个)并重复该整个链。

或者(我可能会这样做),将一个动画放入它自己的方法中,然后在完成块中,添加一个短暂的延迟并调用该方法 - 从而创建一个永久循环。循环创建了重复,但每个动画只是 一个 动画,所以现在您可以在连续调用的数组中前进。所以结构(伪代码)看起来像这样:

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
       
    )

【讨论】:

以上是关于如何在 animateWithDuration 的每个动画之间重复更改 UILabel 的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停和恢复 UIView.animateWithDuration

如何在 animateWithDuration 的每个动画之间重复更改 UILabel 的文本?

如何使用 animateWithDuration:在 iOS 7 上呈现视图控制器时?

在 Swift 中使用 animateWithDuration 自定义 UIViewController 转换

UIView animateWithDuration 太快了

iOS,如何用 animateWithDuration 替换简单的 UIView 图形实例?