Анимировать пульсирующий UILabel?
Я пытаюсь оживить цвет текста на UILabel, чтобы набрать импульс: [Черный] на [Белый] на [Черный] и повторить.
- (void)timerFlash:(NSTimer *)timer {
[[self navTitle] setTextColor:[[UIColor whiteColor] colorWithAlphaComponent:0.0]];
[UIView animateWithDuration:1
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{[[self navTitle] setTextColor:[[UIColor whiteColor] colorWithAlphaComponent:1.0]];}
completion:nil];
}
.
[self setFadeTimer:[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFlash:) userInfo:nil repeats:YES]];
Во-первых, я не уверен в моем методе, мой план (как вы можете видеть выше) заключался в том, чтобы настроить блок анимации и вызвать его с помощью повторяющегося NSTimer до отмены.
Моя вторая проблема (как вы можете видеть выше) заключается в том, что я анимация от черного (альфа-0) до белого (альфа-1), но я не знаю, как снова окунуться в черное, так что анимация петли плавно
По сути, я хочу, чтобы цвет текста пульсировал на UILabel, пока пользователь не нажмет кнопку для продолжения.
EDIT_001:
У меня возникли проблемы, потому что вы не можете анимировать [UILabel setColor:], однако вы можете анимировать [UILabel setAlpha:], поэтому я собираюсь дать это.
EDIT_002:
- (void)timerFlash:(NSTimer *)timer {
[[self navTitle] setAlpha:0.5];
[UIView animateWithDuration:2
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{[[self navTitle] setAlpha:0.9];}
completion:nil];
}
Это работает (BTW: я хочу, чтобы он остановился, поэтому я подключил его к NSTimer, поэтому я могу отменить это), единственное, что это оживляет от midGray до NearWhite, а затем всплывает. Кто-нибудь знает, как я мог бы оживить от nearWhite до midGray, чтобы получить хороший плавный цикл?
![enter image description here]()
EDIT_003: (Решение)
Код, предложенный Дейвом ДеЛонгом (см. ниже), действительно работает при изменении, чтобы использовать атрибут стиля прозрачности CALayer:
UILabel *navTitle;
@property(nonatomic, retain) UILabel *navTitle;
.
// ADD ANIMATION
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
[anim setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[anim setFromValue:[NSNumber numberWithFloat:0.5]];
[anim setToValue:[NSNumber numberWithFloat:1.0]];
[anim setAutoreverses:YES];
[anim setDuration:0.5];
[[[self navTitle] layer] addAnimation:anim forKey:@"flash"];
.
// REMOVE ANIMATION
[[[self navTitle] layer] removeAnimationForKey:@"flash"];
Ответы
Ответ 1
Возможно, вы можете сделать это с помощью CAAnimation
. Я просто нажал небольшой демонстрационный проект, который я сделал некоторое время назад на github. Он показывает олимпийский логотип и заставляет кольца летать в случайном месте на экране, а затем возвращаться в исходное положение. Вероятно, вы могли бы сделать что-то очень похожее, но явно не используя свойство position
.
Здесь базовый код, чтобы сделать одно из колец:
CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"];
[a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[a setFromValue:[NSValue valueWithCGPoint:[layer position]]];
[a setToValue:[NSValue valueWithCGPoint:[self randomPoint]]];
[a setAutoreverses:YES];
[a setDuration:1.0];
[layer addAnimation:a forKey:nil];
Значения fromValue
и toValue
будут CGColorRefs
, а ваш ключевой путь анимации будет другим, но здесь трюк - setAutoreverses:YES
. Это будет анимироваться от fromValue
до toValue
, а затем вернуться к fromValue
. Это довольно штопать.:)
https://github.com/davedelong/Demos/blob/master/OlympicRings
Если это не работает (и это может быть не так), то я могу просто сложить два UILabels
друг над другом и анимировать их значения альфа от 0.0 до 1.0 (или наоборот) в то же время.
Ответ 2
Если вы просто хотите, чтобы это произошло бесконечно, вы можете использовать ответ Дэйва ДеЛонга, или это:
[UIView animateWithDuration:1
delay:0
options:UIViewAnimationOptionAllowUserInteraction |
UIViewAnimationOptionAutoreverse |
UIViewAnimationOptionRepeat
animations:^{[[self navTitle] setTextColor:[UIColor whiteColor]];}
completion:nil];
Преимущество использования CAAnimation, конечно же, в том, что вы можете удалить анимацию позже; с этим, чтобы остановить его, вам придется копать в CALayer и найти анимацию, чтобы остановить его.
Вы предположили, однако, что UILabel.textColor может не быть анимированным. Это возможность. Если это так, вы можете использовать эту же методику для перехода между двумя UILabels разных цветов и просто угасать их альфа-значения.
Ответ 3
(так же, как здесь Отменить блок в UIView animateWithDuration)
Я просто повторяю анимацию и убиваю ее через некоторое время с помощью блока отправки:
- (void)animate // Blink a view three times
{
// We need to stop the animation after a while (0.9 sec)
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.9 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[view.layer removeAllAnimations];
view.alpha = 0.0; // Animation clean-up
});
[UIView animateWithDuration:0.15 // 0.15*6=0.9: It will animate six times (three in reverse)
delay:0.0
options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
animations:^{
view.alpha = 1.0; // Animation
}
completion:NULL];
}