Может ли прокрутка управлять анимацией?
-
19-09-2019 - |
Вопрос
У меня есть UILabel, который отображает текущую дату для текущего представления моего представления прокрутки.Когда я прокручиваю это представление влево (на левые страницы), я бы хотел, чтобы эта метка изменилась на предыдущий день с эффектом пересечения двух дат.
Я беру за образец эффект затухания Springboard при прокрутке на страницу Spotlight.Я думаю, что это похоже, но я понятия не имею, как это реализовать!
Куда мне поместить код, нужно ли мне использовать 2 разных UILabel или, может быть, CoreAnimation?Когда мне изменить дату?
Заранее спасибо !
Решение
- В вашей
scrollViewDidScroll:
метод делегата, проверьте, есть ли представление прокруткиcontentOffset
указывает, что пользователь прокрутил на другую страницу. - Если да, измените текст метки на новую дату.Анимация пока не выполняется, но сделайте это перед тем, как приступить к анимации.
Для анимации добавьте
CATransition
на слой метки и настройте его по своему вкусу:// Create a transition animation and add it to the label's layer: CATransition *transition = [CATransition animation]; transition.type = kCATransitionFade; transition.duration = 0.25; [self.dateLabel.layer addAnimation:transition forKey:@"textTransition"]; // Change the label's text as before: self.dateLabel.text = newDateString;
Этот эффект немного отличается от исчезновения значков Springboard (поскольку они постоянно исчезают при прокрутке страницы Spotlight), но я думаю, что мой подход больше подходит для вашего приложения.Чтобы эмулировать эффект Springboard, вам действительно следует использовать две отдельные метки (с одной и той же рамкой) и изменять их значения непрозрачности по мере изменения contentOffset представления прокрутки.
Другие советы
Использование Core Animation с двумя метками будет работать нормально.Изменение свойства слоя базовой анимации по умолчанию приводит к плавному переходу, поэтому вы можете использовать это в своих интересах.Например:
- (void)crossfadeDateLabels
{
date1Label.layer.opacity = 0.0f;
date2Label.layer.opacity = 1.0f;
}
Или вы можете использовать явную модель анимации, если хотите большего контроля:
- (void)crossfadeDateLabels
{
CABasicAnimation *date1Anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
date1Anim.duration = 1.0f;
date1Anim.fromValue = [NSNumber numberWithFloat:1.0f];
date1Anim.toValue = [NSNumber numberWithFloat:0.0f]
// Do something similar for date2Anim...
[date1Label.layer addAnimation:date1Anim forKey:nil];
[date2Label.layer addAnimation:date2Anim forkey:nil];
}