Мне нужно создать интерактивную анимацию (последовательность встроенных анимаций), которая управляется смещением прокрутки в представлении прокрутки.
Для этого я попытался использовать UIViewPropertyAnimator
, что позволяет мне установитьfractionComplete
свойство довольно простое.
Проблема возникает, когда я использую шкалу времени от 0 до 4 и использую 4 разных аниматора в интервалах 0..1, 1..2 и т. Д. Сразу после друг друга.Перемещение, масштабирование, вращение, настройка цвета и почти все работает, как я ожидал, но настройка альфа, кажется, запоминает только самые последние свойства анимации.Например, если я перевожу альфа между 0 и 1 в каждой из анимаций, он работает только вперед, и после воспроизведения четвертой анимации прокрутка назад не воспроизводит первые три изменения альфа-анимации, а третье начало значения увеличивается.
Пример кода:
- (void)viewDidLoad {
[super viewDidLoad];
self.animator1 = [[UIViewPropertyAnimator alloc] initWithDuration:1.f curve:UIViewAnimationCurveLinear animations:^{
self.leftConstraint.constant = 200.f;
self.redBox.alpha = 0.1f;
[self.view layoutIfNeeded];
}];
self.animator2 = [[UIViewPropertyAnimator alloc] initWithDuration:1.f curve:UIViewAnimationCurveLinear animations:^{
self.topConstraint.constant = 200.f;
self.redBox.alpha = 1.f;
[self.view layoutIfNeeded];
}];
self.animator3 = [[UIViewPropertyAnimator alloc] initWithDuration:1.f curve:UIViewAnimationCurveLinear animations:^{
self.leftConstraint.constant = 30.f;
self.redBox.alpha = 0.4f;
[self.view layoutIfNeeded];
}];
self.animator4 = [[UIViewPropertyAnimator alloc] initWithDuration:1.f curve:UIViewAnimationCurveLinear animations:^{
self.topConstraint.constant = 30.f;
self.redBox.alpha = 1.f;
[self.view layoutIfNeeded];
}];
}
- (IBAction)sliderChanged:(id)sender {
CGFloat value = self.slider.value;
self.label.text = [NSString stringWithFormat:@"%.2f", value];
if (value < 0) {
// pass
} else if (value < 1.f) {
self.animator1.fractionComplete = value;
self.currentAnimatorLabel.text = [NSString stringWithFormat:@"a1 %.2f", value];
} else if (value < 2.f) {
self.animator2.fractionComplete = value - 1.f;
self.currentAnimatorLabel.text = [NSString stringWithFormat:@"a2 %.2f", value - 1.f];
} else if (value < 3.f) {
self.animator3.fractionComplete = value - 2.f;
self.currentAnimatorLabel.text = [NSString stringWithFormat:@"a3 %.2f", value - 2.f];
} else if (value < 4.f) {
self.animator4.fractionComplete = value - 3.f;
self.currentAnimatorLabel.text = [NSString stringWithFormat:@"a4 %.2f", value - 3.f];
}
[self refreshDebugLabel];
}
Пример проекта: https://github.com/gklka/AnimatorTest/tree/master/AnimatorTest
Иллюстрация:
Я что-то пропустил?