Последовательные CAKeyFrameAnimations, исчезающие на экране

РЕДАКТИРОВАТЬ: Прикрепленный код для CAAnimationGroup, анимация рисуется последовательно, но у меня все еще возникает проблема, что firstAnimation исчезает после запуска secondAnimation, и я заметил в документация для CAAnimationGroup говорится:

Свойства removeOnCompletion анимаций в свойстве animations в настоящее время игнорируются.

Как это обойти?


Я пытаюсь анимировать несколько объектов CAKeyFrameAnimation на одном слое, чтобы, когда firstAnimation завершается, путь, который он рисует, оставался на экране, когда secondAnimation запускался, поэтому конечным результатом является изображение, сделанное из путей обоих объектов вместе на экране. .

В настоящее время, если я помещу оба объекта анимации (по порядку) в один и тот же метод и вызову его, на экране будет отображаться только secondAnimation. Если я разделю их и вызову последовательно, firstAnimation будет отображаться на экране, а затем исчезнет, ​​когда начнется secondAnimation. Сами по себе анимации работают именно так, как задумано.

Я попытался найти CAAnimationGroup примеров, потому что это кажется то, что я ищу, но из пары примеров, которые я видел, мне не совсем понятно, что происходит или как чтобы произвести эффект, который я ищу, может ли кто-нибудь показать мне, как последовательно рисовать обе анимации и сохранять результаты на экране?

Вот мой слой, две мои анимации и моя группа:

CAShapeLayer *pathLayer = [CAShapeLayer layer];
pathLayer.frame = self.animationLayer.bounds;
pathLayer.bounds = pathRect;
pathLayer.geometryFlipped = YES;
pathLayer.strokeColor = [[UIColor blackColor] CGColor];
pathLayer.fillColor = nil;
pathLayer.lineWidth = 10.0f;
pathLayer.lineJoin = kCALineJoinBevel;


CAKeyframeAnimation *firstAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"];
firstAnimation.beginTime = 0.0;
firstAnimation.duration = 4.0;
firstAnimation.removedOnCompletion = NO;   //Is being ignored by CAAnimationGroup
firstAnimation.fillMode = kCAFillModeForwards;
firstAnimation.values = [NSArray arrayWithObjects:
                         (id)path0.CGPath,(id)path1.CGPath,
                         (id)path2.CGPath,(id)path3.CGPath,
                         (id)path4.CGPath,(id)path5.CGPath,nil];
firstAnimation.keyTimes = [NSArray arrayWithObjects: 
                         [NSNumber numberWithFloat:0.0],
                         [NSNumber numberWithFloat:0.2],
                         [NSNumber numberWithFloat:0.21],
                         [NSNumber numberWithFloat:0.22],
                         [NSNumber numberWithFloat:0.63],
                         [NSNumber numberWithFloat:1.0], nil];



CAKeyframeAnimation *secondAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"];
secondAnimation.beginTime = 4.0; //This should come directly after firstAnimation
secondAnimation.duration = 3.0;
secondAnimation.removedOnCompletion = NO;   //Is being ignored by CAAnimationGroup
secondAnimation.fillMode = kCAFillModeForwards;
secondAnimation.values = [NSArray arrayWithObjects:
                          (id)path00.CGPath,(id)path01.CGPath,
                          (id)path02.CGPath,nil];
secondAnimation.keyTimes = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.0],
                          [NSNumber numberWithFloat:0.8],
                          [NSNumber numberWithFloat:1.0],nil];



CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = [NSArray arrayWithObjects:firstAnimation,secondAnimation,nil];
group.duration = 7.0;  //The total time of the animations, don't know if redundant
group.delegate = self;

[self.pathLayer addAnimation:group forKey:@"path"];

person Lonso    schedule 13.03.2013    source источник
comment
возможный дубликат iPhone CAAnimations, воспроизводимых последовательно   -  person Till    schedule 14.03.2013
comment
@ Пока я не попробовал рекомендацию из вопроса, и на самом деле она воспроизводит анимацию последовательно, но я все еще стираю первую анимацию, когда начинается вторая, так что чего-то все еще не хватает. Есть предположения?   -  person Lonso    schedule 14.03.2013


Ответы (1)


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

Прием, который я использовал, состоял в том, чтобы создать отдельный слой для каждой анимации вместо того, чтобы помещать обе анимации в один экземпляр CAShapeLayer, а затем указать duration и keyTime для обеих анимаций в соответствии с к контроллеру времени, чтобы получить 1) правильную последовательность времени между анимациями и 2) правильную синхронизацию в каждой анимации.

Используя отдельные слои, removedOnComplete = NO снова работает, поскольку я не использую CAAnimationGroup, поэтому мои анимации сохраняются, что мне действительно нужно в моем приложении.

Я не собираюсь сразу принимать этот ответ, потому что это кажется низким способом сделать что-то, что должно быть более интуитивно понятным на iOS.

person Lonso    schedule 15.03.2013