2010-12-10 10 views
0

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.

Antwort

2

Der Umfang einer CATransaction sollte nur zwischen den Zeilen [CATransaction begin] und [CATransaction commit] liegen.

Auch sollten Sie nicht die [CATransaction flush] in diesem Code benötigen. Apple empfiehlt generell, die Ausführung ausstehender Transaktionen aus Leistungsgründen nicht zu erzwingen, und die Transaktion, die Sie dort einrichten, sollte keine ausstehenden Animationen beeinflussen.

Ich vermute, dieses seltsame Verhalten ist immer noch verwandt mit dem, was Sie in Ihrem previous question gefragt, wo die drei Animationen irgendwie miteinander stören. Wie ich bereits erwähnt habe, verhält es sich so, als würden die drei Animationen zu einer Ebene hinzugefügt, nicht zu drei unabhängigen. Ich würde nachsehen und sicherstellen, dass es dazu keine Möglichkeit gibt (überkreuzte Zeiger usw.).

+0

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)). –

+0

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. –

+0

@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. –