Группирование двух основных анимаций с помощью CAAnimationGroup приводит к тому, что одна CABasicAnimation не запускается - PullRequest
8 голосов
/ 22 января 2010

У меня есть две анимации, которые я пытаюсь выполнить на UILabel на iPhone с ОС 3.1.2. Первый раскачивает UILabel взад и вперед:

CAKeyframeAnimation *rock;
rock = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
[rock setBeginTime:0.0f];
[rock setDuration:5.0];
[rock setRepeatCount:10000];

NSMutableArray *values = [NSMutableArray array];
MovingMath *math = [[MovingMath alloc] init];

// Center start position
[values addObject:[math DegreesToNumber:0]];

// Turn right
[values addObject:[math DegreesToNumber:-10]];

// Turn left
[values addObject:[math DegreesToNumber:10]];

// Re-center
[values addObject:[math DegreesToNumber:0]];

// Set the values for the animation
[rock setValues:values];

[math release];

Вторая увеличивает UILabel, чтобы она стала больше:

NSValue *value = nil;
CABasicAnimation *animation = nil;
CATransform3D transform;
animation = [CABasicAnimation animationWithKeyPath:@"transform"];
transform = CATransform3DMakeScale(3.5f, 3.5f, 1.0f);
value = [NSValue valueWithCATransform3D:transform];
[animation setToValue:value];
transform = CATransform3DMakeScale(1.0f, 1.0f, 1.0f);
value = [NSValue valueWithCATransform3D:transform];
[animation setFromValue:value];
[animation setAutoreverses:YES];
[animation setDuration:30.0f];
[animation setRepeatCount:10000];
[animation setBeginTime:0.0f];

Добавление любой из этих анимаций непосредственно в слой UILabel работает, как и ожидалось.

Однако, если я пытаюсь сгруппировать анимации вместе, первая анимация «качания» не работает:

CAAnimationGroup *theGroup = [CAAnimationGroup animation];

theGroup.duration = 5.0;
theGroup.repeatCount = 10000;
theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
theGroup.animations = [NSArray arrayWithObjects:[self rockAnimation], [self zoomAnimation], nil]; // you can add more

// Add the animation group to the layer
[[self layer] addAnimation:theGroup forKey:@"zoomAndRotate"];

Порядок добавления анимации в группу не имеет значения. Вместо увеличения, как описано выше, я попытался изменить границы, но это также оказалось безуспешным. Любое понимание будет с благодарностью. Спасибо.

Ответы [ 2 ]

8 голосов
/ 25 января 2010

Вы пытаетесь одновременно анимировать два изменения в одном свойстве - преобразование вашего CALayer. В первой анимации вы используете вспомогательный ключевой путь, чтобы изменить преобразование для создания поворота, а во второй вы изменяете преобразование напрямую, чтобы произвести масштабирование. Вторая анимация перезаписывает первую, потому что вы создаете целые преобразования, которые масштабируются и анимируются только между ними.

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

CABasicAnimation *animation = nil;
animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[animation setToValue:[NSNumber numberWithDouble:3.5]];
[animation setFromValue:[NSNumber numberWithDouble:1.0]];
[animation setAutoreverses:YES];
[animation setDuration:30.0f];
[animation setRepeatCount:10000];
[animation setBeginTime:0.0f];

вы должны иметь возможность качания и масштабирования на вашем слое.

2 голосов
/ 22 января 2010

Я считаю, что CAAnimationGroup - это не то, что вам нужно.Из документации для CAAnimationGroup:

CAAnimationGroup позволяет группировать и запускать несколько анимаций одновременно.Сгруппированные анимации выполняются во временном пространстве, указанном экземпляром CAAnimationGroup.

Похоже, вы не хотите, чтобы анимации запускались одновременно, а скорее последовательно.Возможно, есть более простые способы сделать это, но я обнаружил, что использование метода animationDidStop:finished: хорошо работает.Для этого создайте свою первую анимацию и установите ее делегат для объекта, который будет реализовывать метод animationDidStop:finished:, и добавьте анимацию как обычно (без использования CAAnimationGroup).В методе:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
    // Create the second animation and add it
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...