3

我仍在学习 UIAnimations,刚刚进入它,我偶然发现了一个我不知道如何解决的问题。我见过你获得新的高分的游戏,它将新的高分添加到旧的高分上,它们使数字上升或下降。它看起来非常酷,视觉上令人愉悦。

谁能向我解释这是如何完成的?如果这个问题很容易解决,我深表歉意,就像我说我仍在努力学习/完善动画一样。

提前致谢

4

3 回答 3

10

我从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;

希望这可以帮助!

于 2012-07-25T23:43:26.220 回答
2

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

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

一旦你有了一组数字图像,你就必须计算在转换过程中哪些数字会改变,以及它们是增加还是减少,然后通过从顶部/底部推入来转换到下一个数字(我认为有一个内置的过渡可以做到这一点,请查看 Core Animation 文档)。

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

于 2012-07-25T22:12:45.263 回答
0

在此处输入图像描述

使用显示功能,这可以正常工作。有一些垂直运动会很好,但它要么是 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;
    }
}
于 2018-09-07T08:27:02.680 回答