Анимировать текст UILabel между двумя числами? - PullRequest
78 голосов
/ 14 марта 2011

Я новичок в программировании для iPhone и Mac (ранее разрабатывался для Windows), и у меня возник вопрос:

Как мне анимировать свойство text для UILabel между двумя числамиНапример, от 5 до 80 в стиле Ease-Out?Возможно ли это с CoreAnimation?Я искал в Google в течение часа, но не нашел ничего, что решало бы мою проблему.Чего я хочу: оживить деньги пользователей за простую игру.Это выглядит не очень хорошо, когда он просто переходит от 50 к 100 или что-то подобное без анимации.

У кого-нибудь есть идеи, как это сделать?1016 *

Спасибо!

Ответы [ 5 ]

158 голосов
/ 07 июня 2011

Вы можете использовать автоматические переходы. Работает на отлично:

// Add transition (must be called after myLabel has been displayed)
 CATransition *animation = [CATransition animation];
animation.duration = 1.0;
animation.type = kCATransitionFade;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[myLabel.layer addAnimation:animation forKey:@"changeTextTransition"];

// Change the text
myLabel.text = newText;

Этот код работает, если myLabel уже отображается. Если нет, myLabel.layer будет иметь значение nil, и анимация не будет добавлена ​​к объекту.


в Swift 4 , что будет:

let animation: CATransition = CATransition()
animation.duration = 1.0
animation.type = kCATransitionFade
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
myLabel.layer.add(animation, forKey: "changeTextTransition")
26 голосов
/ 17 сентября 2014

Хорошо работает!

Objective-C

[UIView transitionWithView:self.label 
                  duration:.5f 
                   options:UIViewAnimationOptionCurveEaseInOut | 
                           UIViewAnimationOptionTransitionCrossDissolve 
                animations:^{

    self.label.text = rand() % 2 ? @"111!" : @"42";

} completion:nil];

Swift

UIView.transitionWithView(label, duration: 0.25, options: [.CurveEaseInOut, .TransitionCrossDissolve], animations: {
    self.label.text = (arc4random() % 2 == 0) ? "111" : "222"
}, completion: nil)
7 голосов
/ 11 июня 2013

Я нашел отличный механизм для анимации значений с различными функциями синхронизации, которые называются PRTween .Установите классы и создайте некоторый код следующим образом:

- (IBAction)tweenValue
{
    [[PRTween sharedInstance] removeTweenOperation:activeTweenOperation];
    PRTweenPeriod *period = [PRTweenPeriod periodWithStartValue:0.0 endValue:100.0 duration:1.0];
    activeTweenOperation = [[PRTween sharedInstance] addTweenPeriod:period
                                                             target:self
                                                           selector:@selector(update:)
                                                     timingFunction:&PRTweenTimingFunctionCircOut];
}

- (void)update:(PRTweenPeriod*)period
{
    self.animatingView.center = CGPointMake(period.tweenedValue + 100.0, 200.0);
    self.valueLabel.text = [NSString stringWithFormat:@"%.2f", period.tweenedValue];
}

Работает для меня.:)

5 голосов
/ 17 ноября 2015

Если вы хотите, чтобы он считал вверх и вниз с новым номером, отталкивающим предыдущий номер (например, тикером или чем-то еще):

let animation = CATransition()
animation.removedOnCompletion = true
animation.duration = 0.2
animation.type = kCATransitionPush
animation.subtype = newValue > value ? kCATransitionFromTop : kCATransitionFromBottom
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
valueLabel.layer.addAnimation(animation, forKey:"changeTextTransition")
3 голосов
/ 25 января 2016

В Swift 2.0, используя метод UIView.transitionWithView():

UIView.transitionWithView(self.payPeriodSummaryLabel,
        duration: 0.2,
        options: [.CurveEaseInOut, .TransitionCrossDissolve],
        animations: { () -> Void in
            self.label.text = "your text value"
        }, completion: nil)
...