Как анимировать текстовый цвет UILabel? - PullRequest
2 голосов
/ 23 июля 2010

Не могли бы вы сказать мне , как анимировать textColor UILabel ?

Например, я хотел бы изменить цвет с белого на красный, а затем вернуться к беломус эффектом появления, и повторите это примерно 3 раза.

Мне нужна эта анимация, потому что мое приложение получает данные в реальном времени из Интернета и при изменении значения Мне нужно анимировать этотекстовое значение сообщить пользователю, что оно изменилось .

Большое вам спасибо.

Ответы [ 7 ]

12 голосов
/ 23 октября 2011

Причина, по которой textColor не является анимируемым, заключается в том, что UILabel использует обычный CALayer вместо CATextLayer.

Чтобы сделать анимируемым textColor (а также текст, шрифт и т. Д.), Мы можем создать подкласс UILabel и использовать для него CATextLayer.

Это довольно много работы, но, к счастью, я уже сделал это: -)

В этой статье

вы можете найти полное объяснение + замену UILabel с открытым исходным кодом.
7 голосов
/ 26 января 2015

Это старый вопрос, но в настоящее время определенно возможно анимировать цвет текста с помощью CrossDissolve. Вот как это сделать в Swift:

UIView.transition(with: myLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
    myLabel.textColor = .white
}, completion: nil)
4 голосов
/ 07 октября 2012

Вопрос задавался давно, но здесь идет.

Как уже говорилось выше, textColor для UILabel не может быть анимирован.Полезный трюк состоит в том, чтобы динамически создать в коде другой UILabel, с такими же атрибутами и положением, но с цветом назначения.Вы анимируете альфа новой UILabel от 0,0 до 1,0, поэтому создается впечатление, что текстовый цвет оригинальной UILabel анимирован.Когда анимация будет завершена, вы можете удалить одну из меток.

Вот пример метода уровня класса, который на короткое время меняет свой текст на TextColor и возвращает обратно.

+(void)colorizeLabelForAWhile:(UILabel *)label withUIColor:(UIColor *)tempColor animated:(BOOL)animated
{
    // We will:
    //      1) Duplicate the given label as a temporary UILabel with a new color.
    //      2) Add the temp label to the super view with alpha 0.0
    //      3) Animate the alpha to 1.0
    //      4) Wait for awhile.
    //      5) Animate back and remove the temporary label when we are done.

    // Duplicate the label and add it to the superview
    UILabel *tempLabel = [[UILabel alloc] init];
    tempLabel.textColor = tempColor;
    tempLabel.font = label.font;
    tempLabel.alpha = 0;
    tempLabel.textAlignment = label.textAlignment;
    tempLabel.text = label.text;
    [label.superview addSubview:tempLabel];
    tempLabel.frame = label.frame;

    // Reveal the temp label and hide the current label.
    if (animated) [UIView beginAnimations:nil context:nil];
    tempLabel.alpha = 1;
    label.alpha = 0;
    if (animated) [UIView commitAnimations];

    // Wait for while and change it back.
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, FOR_AWHILE_TIME*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        if (animated) {
            // Change it back animated
            [UIView animateWithDuration:0.5 animations:^{
                // Animate it back.
                label.alpha = 1;
                tempLabel.alpha = 0;
            } completion:^(BOOL finished){
                // Remove the tempLabel view when we are done.
                [tempLabel removeFromSuperview];
            }];
        } else {
            // Change it back at once and remove the tempLabel view.
            label.alpha = 1.0;
            [tempLabel removeFromSuperview];
        }
    });
}
4 голосов
/ 23 июля 2010

Я не уверен, что textColor можно анимировать непосредственно на UILabel.Но если вы используете CATextLayer , этот эффект будет намного легче получить,

0 голосов
/ 25 января 2018

Благодаря этому ответу - я достиг этого с помощью перекрестного растворения:

extension UILabel {
    func animateTextColor(to color: UIColor) {
        UIView.transition(with: self,
                          duration: 0.25,
                          options: .transitionCrossDissolve,
                          animations: { [weak self] in
                            self?.textColor = color
        })
    }
}

Использование:

label.animateTextColor(to: .red)
0 голосов
/ 23 августа 2016
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = [UIColor redColor];
} completion:^(BOOL finished) {
}];

Попробуйте:)

0 голосов
/ 28 мая 2015

Существует простое решение без какого-либо подкласса с использованием подхода из этого ответа дважды .

Возможная реализация в Objective-C может выглядеть следующим образом:

- (void)blinkTextInLabel:(UILabel *)label toColor:(UIColor *)color
{
    [UIView transitionWithView:label duration:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        // set to background color (change the color if necessary)
        label.textColor = [UIColor whiteColor];
    } completion:^(BOOL finished) {
        [UIView transitionWithView:label duration:0.5f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
            label.textColor = color;
        } completion:nil];
    }];
}

Затем просто вызовите вспомогательный метод (здесь: внутри того же класса, используя UITableViewCell):

[self blinkTextInLabel:myCell.textLabel toColor:[UIColor redColor]];

Это сработало для меня, используя iOS 8.3 - он может работать и на других версиях, поскольку используемый метод доступен начиная с iOS 4.0, но я этого не проверял.

Надеюсь, это поможет.

...