2010-07-23 4 views
2

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

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

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

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

ответ

4

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

+0

Не могли бы вы объяснить подробнее об этом, я новичок в разработке Iphone :) –

+0

Пойдите, много читайте на CoreAnimation и CALayers :) –

+0

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html Его слишком большой предмет, чтобы войти в него здесь. –

12

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

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

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

Вы можете найти полное объяснение + капля в замене с открытым исходным кодом для UILabel в этом article

+0

+1: Это было очень полезно. Я попробовал обмен сообщениями на GitHub, но, похоже, вы не создали адрес электронной почты. Раздел «Добавление AUIAnimatableText в ваш проект» в readme необходимо обновить, включив дополнительный шаг: «2. Добавьте UIFont + CoreTextExtensions.h + m в свой проект». Еще раз спасибо! – FreeAsInBeer

+0

Существует гораздо более простое решение, см. [Мой ответ] (http://stackoverflow.com/a/30506117/3451975). – Dschee

4

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

Как указано выше, текстColor для UILabel не способен к проживанию. Полезный трюк состоит в том, чтобы динамически создавать в коде еще один UILabel с теми же атрибутами и положением, но с цветом назначения. Вы анимируете альфа нового UILabel от 0.0 до 1.0, поэтому он выглядит так, как textColor исходного 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]; 
     } 
    }); 
} 
+0

Да, Thans PostPCDev, ваш ответ - это то, что я сделал :) –

+0

Это не отличное решение, потому что текст сглажен. Будут странные артефакты рядом с краями текста, особенно при анимации цветов с очень разной яркостью. –

3

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

UIView.transitionWithView(self.newsLabel, 
    duration: 0.5, 
    options: UIViewAnimationOptions.TransitionCrossDissolve, 
    animations: { 
     self.newsLabel.textColor = self.inactiveForegroundColor 
    }, completion: nil) 
+0

Спасибо, работает как шарм! :) – Dschee

0

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

Возможная реализация в 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, но я не тестировал это.

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

0
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    label.textColor = [UIColor redColor]; 
} completion:^(BOOL finished) { 
}]; 

Try :)

0

Благодаря this answer - я достиг этого с крестом растворяться:

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)