У меня есть две анимации, которые я пытаюсь выполнить на 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"];
Порядок добавления анимаций группе не имеет значения. Вместо изменения масштаба, таким образом выше, я пытался изменить границы, но это было неудачно также. Любое понимание значительно ценилось бы.Спасибо.
Вы пытаетесь одновременно анимировать два изменения в одно свойство, преобразование вашего калайнера. В первой анимации вы используете хелперную клавишу, чтобы изменить преобразование для создания вращения, а во-вторых, вы изменяете преобразование непосредственно для получения масштабирования. Вторая анимация перезаписывает первое, потому что вы строите целые преобразования, которые масштабируются только и анимация между ними.
Похоже, что вы можете вызвать как масштабирование, так и вращение вашего слоя, выполненного, используя хелперные клавиатуры для обеих анимаций. Если вы измените свой код в анимации масштабирования, чтобы прочитать
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];
, вы должны иметь как качалку, так и масштабирование на вашем слое.
Я считаю, что CaanimationGroup не то, что вы хотите. Из документации для CaanimationGroup:
CaanimationGroup позволяет несколько анимации, которые будут сгруппированы и бегать одновременно. Сгруппированные анимации пройти в пространстве с временем, указанным Экземпляр CaanimationGroup.
Похоже, вы не хотите, чтобы ваша анимация запускала одновременно, довольно последовательно. Там могут быть простые способы сделать это, но я нашел полагаясь на AnimationDidStop: закончен:
метод хорошо работает. Для этого создайте свою первую анимацию и установите ее делегат на объект, который будет реализовывать AnimationDIDSTOP: Закончено:
метод и добавьте анимацию как обычное (без использования CaanimationGroup). В методе:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
// Create the second animation and add it
}