Objective c 使用数字设置UILabel的动画

Objective c 使用数字设置UILabel的动画,objective-c,ios,xcode,animation,Objective C,Ios,Xcode,Animation,我仍然在学习UIAnimations,刚刚进入它,我偶然发现了一个我不知道如何解决的问题。我看过一些游戏,你会得到一个新的高分,它会把新的高分加到旧的高分上,然后让数字向上或向下移动。它看起来很酷,在视觉上令人愉悦 有人能解释一下这是怎么做到的吗?如果这个问题很容易解决,我很抱歉,就像我说的,我仍在努力学习/完善动画 提前感谢如果我在这里出错,人们可以纠正我,但我非常确定您必须手动编写此动画。如果你足够努力的话,你可能会在网上的某个地方找到一个开源版本 可以拍摄UILabel的图像,并使用siz

我仍然在学习UIAnimations,刚刚进入它,我偶然发现了一个我不知道如何解决的问题。我看过一些游戏,你会得到一个新的高分,它会把新的高分加到旧的高分上,然后让数字向上或向下移动。它看起来很酷,在视觉上令人愉悦

有人能解释一下这是怎么做到的吗?如果这个问题很容易解决,我很抱歉,就像我说的,我仍在努力学习/完善动画


提前感谢

如果我在这里出错,人们可以纠正我,但我非常确定您必须手动编写此动画。如果你足够努力的话,你可能会在网上的某个地方找到一个开源版本

可以拍摄
UILabel
的图像,并使用
sizeWithFont:
确定每个字符的宽度,然后根据每个数字将图像切割成多个部分。或者,您可以为每个数字设置多个
UILabel
s

一旦你有了一个数字图像数组,你就必须计算哪些数字在转换过程中会发生变化,以及它们是增加还是减少,然后通过从上/下推动它来转换到下一个数字(我认为有一个内置的转换来实现这一点,在核心动画文档中查看)

您可能希望通过它们增加/减少多少来确定,并使用该值来计算动画需要多长时间。这样,如果你从5到900,最后一个数字的动画速度必须非常快,倒数第二个数字的动画速度为1/10,第三个数字的动画速度为1/100,等等。

我从中提取了代码,但注意到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;
希望这有帮助

使用“显示”功能,这在正常工作中不起作用。有一些垂直运动是很好的,但它要么是从底部的KCATRANSION,要么是从顶部的KCATRANSION——实际上我们需要从底部的KCATRANSION |从顶部的KCATRANSION,但这不是一件事。代码如下:

-(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;
    }
}
-(void)countUpLabel:(UILabel*)label fromValue:(int)fromValue to value:(int)to value with delay:(float)delay{
int距离=(int)到值-(int)从值;
int abs距离=abs(距离);
浮动基准持续时间=1.0f;
浮动总持续时间=绝对距离/100.0f*基本持续时间;
浮动增量持续时间=总持续时间/(浮动)距离;
int方向=(fromValue
@AlexG-没问题。您可能想稍微处理一下参数,但它应该可以正常工作。谢谢您的解释。Qegal提供了一个例子,所以只有出于这个原因我才接受+不过我还是要找一个好答案