ich einige Code gesehen haben, dass die indem nach einer bestimmten Schicht aus es ist Superlayer entfernt:Der Umfang eines CATransaction Block
void RemoveImmediately(CALayer *layer) {
[CATransaction flush];
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[layer removeFromSuperlayer];
[CATransaction commit];
}
Ich habe geschrieben, ein Verfahren, das die Position einer bestimmten Schicht in einer animierten ändert Weg mit CAKeyframeAnimation, die wie folgt aussieht:
- (void)animateMovingObject:(NXUIObject*)obj
fromPosition:(CGPoint)startPosition
toPosition:(CGPoint)endPosition
duration:(NSTimeInterval)duration {
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.duration = duration;
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y);
CGPathAddCurveToPoint(curvedPath, NULL,
startPosition.x, endPosition.y,
startPosition.x, endPosition.y,
endPosition.x, endPosition.y);
pathAnimation.path = curvedPath;
[obj addAnimation:pathAnimation forKey:@"pathAnimation"];
CGPathRelease(curvedPath);
}
Bis zu wissen, ist alles in Ordnung. Nun nehme ich an, ich habe in meiner App eine "Master-Ebene", die 3 Sublayer hat. Ich möchte, dass die ersten beiden Sublayer an eine andere Position verschoben werden und die letzte entfernt wird. Also habe ich folgendes:
CALayer obj1 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj1];
[self animateMovingObject:obj1
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(100.0, 100.0)
duration:2.0];
CALayer obj2 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj2];
[self animateMovingObject:obj2
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(150.0, 100.0)
duration:2.0];
CALayer obj3 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj3];
// ...
RemoveImmediately(obj3); // This removes the two previous animations too
//[obj3 removeFromSuperlayer]; // This just removes obj3, the previous animations works
Beachten Sie, dass, wenn ich RemoveImmediately()
nennen, auch obj3
als Argument übergeben ich nicht die ersten beiden Schichten werden animiert sehen. Allerdings, wenn ich die obj3
nur durch den Aufruf removeFromSuperlayer
entfernen, werden die ersten beiden Ebenen normal animiert. Sieht so aus, als ob der CATransaction-Block alle Animationen abbricht, auch wenn diese mit CAKeyframeAnimation erstellt wurden.
Was ich vermisse ich?
Dank Im Voraus.
Danke, ich habe mir den Weg gezeigt, Dinge zu erledigen! Das Problem war die "Flush" -Methode. Ich habe es entfernt und jetzt kann ich sehen, dass alle Animationen normal laufen. Das einzige, was "obj1", "obj2" und "obj3" gemeinsam hat, ist, dass sie Unterschichten von "MasterLayer" sind, also gab es keine gekreuzten Zeiger oder irgendwelche Animationen, die sich in andere einmischen. Durch Aufruf der Methode 'flush' wurden die vorherigen Animationen gestoppt (die delegate-Methode 'animationDidStop: finished:' beendete Argument gab NO zurück und gab an, dass sie manuell gestoppt wurde (was beim Aufruf der 'flush' -Methode passierte)). –
Obwohl es funktionierte, habe ich versucht zu verstehen, was die Dokumentation über die Flush-Methode sagt (http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/ occ/clm/CATransaction/flush) und es ist mir immer noch nicht klar, warum meine expliziten Animationen "gestoppt" werden. –
@Eduardo - Ja, ich hatte auch Probleme mit der Animation von [CATransaction flush], da es die normale Rendering-Pipeline von Core Animation stört. Nur einmal habe ich es für etwas gebraucht, und selbst dann habe ich einen Weg gefunden, mein Tun neu zu gestalten, um den Anruf schließlich zu entfernen. –