我仍在学习 UIAnimations,刚刚进入它,我偶然发现了一个我不知道如何解决的问题。我见过你获得新的高分的游戏,它将新的高分添加到旧的高分上,它们使数字上升或下降。它看起来非常酷,视觉上令人愉悦。
谁能向我解释这是如何完成的?如果这个问题很容易解决,我深表歉意,就像我说我仍在努力学习/完善动画一样。
提前致谢
我仍在学习 UIAnimations,刚刚进入它,我偶然发现了一个我不知道如何解决的问题。我见过你获得新的高分的游戏,它将新的高分添加到旧的高分上,它们使数字上升或下降。它看起来非常酷,视觉上令人愉悦。
谁能向我解释这是如何完成的?如果这个问题很容易解决,我深表歉意,就像我说我仍在努力学习/完善动画一样。
提前致谢
我从sergio 建议你看的帖子中获取了代码,但注意到 Anshu 提到你想要一个上下移动动画而不是淡入/淡出动画,所以我更改了代码以适应你想要的. 干得好:
// Add transition (must be called after myLabel has been displayed)
CATransition *animation = [CATransition animation];
animation.duration = 1.0; //You can change this to any other duration
animation.type = kCATransitionMoveIn; //I would assume this is what you want because you want to "animate up or down"
animation.subtype = kCATransitionFromTop; //You can change this to kCATransitionFromBottom, kCATransitionFromLeft, or kCATransitionFromRight
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[myLabel.layer addAnimation:animation forKey:@"changeTextTransition"];
// Change the text
myLabel.text = newText;
希望这可以帮助!
如果我在这里错了,人们可以纠正我,但我很确定你必须手动编写这个动画。如果你足够努力的话,你也许可以在网上的某个地方找到一个开源版本。
可以拍摄 a 的图像UILabel
并用于sizeWithFont:
确定每个字符的宽度,然后根据每个数字将图像切割成多个部分。或者,您可以UILabel
为每个数字设置多个 s。
一旦你有了一组数字图像,你就必须计算在转换过程中哪些数字会改变,以及它们是增加还是减少,然后通过从顶部/底部推入来转换到下一个数字(我认为有一个内置的过渡可以做到这一点,请查看 Core Animation 文档)。
您可能想要确定它们增加/减少了多少,并用它来计算动画需要多长时间。那样的话,如果你从 5 到 900,最后一个数字的动画必须非常快,倒数第二个数字的动画速度是 1/10,第三个数字是 1/100,等等。
使用显示功能,这可以正常工作。有一些垂直运动会很好,但它要么是 kCATransitionFromBottom 要么是 kCATransitionFromTop - 实际上我们需要 kCATransitionFromBottom | kCATransitionToTop,但这不是一回事。这是代码:
-(void)countUpLabel:(UILabel *)label fromValue:(int)fromValue toValue:(int)toValue withDelay:(float)delay{
int distance = (int)toValue - (int)fromValue;
int absDistance = abs(distance);
float baseDuration = 1.0f;
float totalDuration = absDistance / 100.0f * baseDuration;
float incrementDuration = totalDuration / (float)absDistance;
int direction = (fromValue < toValue) ? 1 : -1;
//NSString * subtype = (direction == 1) ? kCATransitionFromBottom : kCATransitionFromTop;
for (int n = 0; n < absDistance; n++){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
CATransition * fade = [CATransition animation];
fade.removedOnCompletion = true;
fade.duration = incrementDuration;
fade.type = kCATransitionReveal;
fade.subtype = kCATransitionMoveIn;
[label.layer addAnimation:fade forKey:@"changeTextTransition"];
int value = fromValue + (n+1) * direction;
label.text = [NSString stringWithFormat:@"%i", value];
});
delay += incrementDuration;
}
}