如何在 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 转换