Die Gruppierung der zwei-Kern-Animationen mit CAAnimationGroup Ursachen einer CABasicAnimation nicht zu laufen
Habe ich zwei Animationen, die ich versuche zu führen, die auf einem UILabel auf dem iPhone mit OS 3.1.2. Die ersten Felsen der UILabel hin und her:
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];
Die zweite zoomt das UILabel, so dass es größer wird:
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];
Hinzufügen entweder eines dieser Animationen direkt auf die UILabel s-layer funktioniert wie erwartet.
Allerdings, wenn ich versuche, zu Gruppe der Animationen zusammen, die ersten "rocking" - animation funktioniert nicht:
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"];
Die Reihenfolge der Zugabe der Animationen zu der Gruppe spielt keine Rolle. Statt Zoomen, in der Art und Weise oben, ich habe versucht, die änderung der Grenzen, aber das war nicht erfolgreich, da gut. Keine Einsicht würde sehr geschätzt werden. Danke.
- Zu beachten mein Kommentar unten... ich will diese Animationen zu passieren zur gleichen Zeit. Das problem ist, dass bei der Verwendung der Gruppe, rockAnimation nicht ausgeführt; nur zoomAnimation läuft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie versuchen, gleichzeitig zu animieren zwei änderungen an einer Eigenschaft, Ihre CALayer-transform. In der ersten animation, die Sie verwenden einen Helfer Schlüsselpfad ändern der Transformation zum erzeugen einer rotation, und in der zweiten ändern Sie die Transformation direkt zu produzieren, die eine Skalierung. Die zweite animation ist das überschreiben der ersten, denn Sie bauen ganze verwandelt, das nur noch skaliert und animiert Sie.
Scheint es, dass Sie verursachen können, sowohl die Skalierung und Drehung Ihrer Ebene auftreten, durch Verwendung von Helfer keypaths für beide Animationen. Wenn Sie den code ändern, der auf der Skalierung der animation zu Lesen
sollten Sie in der Lage sein, beides zu haben, Schaukeln und Skalierung auf Ihre Ebene.
Ich glaube CAAnimationGroup ist nicht, was Sie wollen. Aus der Dokumentation für CAAnimationGroup:
Es klingt wie Sie nicht möchten, dass Ihre Animationen gleichzeitig ausgeführt, sondern sequenziell. Es gibt vielleicht einfachere Wege, um dies zu tun, aber ich habe gefunden, sich auf die
animationDidStop:finished:
Methode gut funktioniert. Um dies zu tun, erstellen Ihre erste animation, und legen Sie es delegieren, um ein Objekt, das zum implementieren deranimationDidStop:finished:
- Methode, und fügen Sie die animation als normal (ohne Verwendung CAAnimationGroup). In der Methode: