我想在 UILabel
上执行一系列动画,所以我查找了在 iOS7 中添加的 UIViewKeyframeAnimations
。
我想做的简化版本是:
- 淡出 UILabel,持续时间为 0.5 秒
- 等一秒
用新文本淡入 UILabel,持续时间为 0.5 秒
NSTimeInterval duration = 2; [UIView animateKeyframesWithDuration:duration delay:0 options:UIViewKeyframeAnimationOptionAllowUserInteraction | UIViewAnimationOptionOverrideInheritedOptions animations:^{ [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.5/duration animations:^{ self.label.alpha = 0; }]; [UIView addKeyframeWithRelativeStartTime:1.5/duration relativeDuration:0.5/duration animations:^{ self.label.text = [@(arc4random_uniform(4000)) stringValue]; self.label.alpha = 1; }]; } completion:nil];
结果是标签文本淡出并重新出现新文本,然后再次淡出并再次淡入。
结果视频:Animation Failure
干杯 莫腾
最佳答案
您声明:“结果是标签文本淡出并重新出现新文本,然后再次淡出并再次淡入。”。然而,我在电影中看到的是,alpha 过渡按预期工作,淡出和淡入。您期望的行为的唯一异常(exception)是,文本更改在动画开始时就已经应用,而不是在动画第二个关键帧的开始。
重要的是要了解 addKeyframeWithRelativeStartTime block 中的代码会在调用 animateKeyframesWithDuration 后立即执行。任何可动画的变化(帧、alpha 等)都将被动画化。同样,任何不是自动动画 View 属性的内容(例如标签的文本更改)都将立即可见。
为了帮助说明这一点,请尝试在所有动画 block (包括 animateKeyframesWithDuration 和 addKeyframeWithRelativeStartTime)的开头放置一个 NSLog 语句,并在完成 block 中放置一个。您会看到每个 NSLog 除了完成 block 中的那个都有完全相同的日志时间。
正是出于这个原因,下面的代码将起作用,因为完整 block 的执行被推迟到第一个动画完成时:
[UIView animateWithDuration:1 animations:^{
self.label.alpha = 0;
} completion:^(BOOL finished) {
self.label.text = [@(arc4random_uniform(4000)) stringValue];
[UIView animateWithDuration:1 animations:^{
self.label.alpha = 1;
}];
}];
关于ios - 更改 UILabel 的文本使其在使用 UIViewKeyframeAnimations 时重新出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26402062/