Альфа не работает после использования нескольких UIViewPropertyAnimators - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно создать интерактивную анимацию (последовательность встроенных анимаций), которая управляется смещением прокрутки в представлении прокрутки.

Для этого я попытался использовать 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

Иллюстрация: Animation

Я что-то пропустил?

...