基本上我正在尝试实现一个动画,它会在返回原始文本之前将标签的文本替换几秒钟。我已经设法让标签在3秒后更改文本并淡出,但是我无法弄清楚如何在动画完成后将文本返回到原始状态。
以下是我目前的情况:
@IBAction func fade() {
userMessageLabel.alpha = 100
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(3)
userMessageLabel.text = "Name is not valid!"
userMessageLabel.alpha = 0
UIView.commitAnimations()
}
我需要文字标签返回“请输入你的名字”
非常感谢任何帮助。
答案 0 :(得分:5)
我使用延迟解决了这个问题:
userMessageLabel.text = "Name is not valid!"
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
userMessageLabel.text = "Please enter your first name"
}
我的解决方案包括稍微简化this answer
的延迟您似乎已经知道如何将文本设置为淡出或淡出。如果需要,可以将动画代码添加到asyncAfter
延迟函数
答案 1 :(得分:0)
在UIView上使用以下类方法可能是最好的方法。动画结束后 - 如果提供完成块,代码将被执行。
在您的示例中,您可以创建完成块,将文本标签重置为所需的值。
class func animateWithDuration(_duration: NSTimeInterval,
animations animations: (() -> Void)!,
completion completion: ((Bool) -> Void)!)
沿着这些方向的东西将达到预期的效果。在完成块中,您可以使用另一个动画。
UIView.animateWithDuration(3.0, animations: {
userMessageLabel.text = "Name is not valid!"
userMessageLabel.alpha = 0.0
}, completion: {
userMessageLabel.alpha = 1.0
userMessageLabel.text = "Please enter your first name"
})
答案 2 :(得分:0)
我使用来自this的 Swift3 对此进行了测试,效果非常好!
<强>目标C 强>
[UIView transitionWithView:self.label
duration:0.25f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.label.text = rand() % 2 ? @"Nice nice!" : @"Well done!";
} completion:nil];
Swift 3
UIView.transition(with: label,
duration: 0.25,
options: .transitionCrossDissolve,
animations: { [weak self] in
self?.label.text = (rand() % 2 == 0) ? "One" : "Two"
}, completion: nil)