15 Stimmen

Animieren einer Form mit CoreAnimation

Ich nähere mich der Kernanimation und dem Zeichnen empirisch. Ich versuche, eine einfache Form zu animieren; die fragliche Form besteht aus 3 Linien und einer Bezier-Kurve. Eine rote Linie ist auch gezeichnet, um die Kurve Kontrollpunkte zeigen.

Alt-Text http://img.skitch.com/20091119-1ufar435jdq7nwh8pid5cb6kmm.jpg

Mein Hauptcontroller fügt einfach diese Unteransicht hinzu und ruft die adjustWave Methode, wenn touchesEnd . Hier ist der Code für meine Klasse zum Zeichnen von Formen. Wie Sie sehen, hat die Klasse eine Eigenschaft, cp1x (das x des Bezier-Kontrollpunkts 1). Dies ist der Wert, den ich gerne animieren würde. Geist, das ist ein dummer Versuch ...

- (void)drawRect:(CGRect)rect {
    float cp1y = 230.0f;
    float cp2x = 100.0f;
    float cp2y = 120.0f;

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextClearRect(ctx, rect);

    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, 10.0f, 200.0f); 
    CGPathAddCurveToPoint (path, NULL, cp1x, cp1y, cp2x, cp2y, 300.0f, 200.0f);
    CGPathAddLineToPoint(path, NULL, 300.0f, 300.0f); 
    CGPathAddLineToPoint(path, NULL, 10.0f, 300.0f); 
    CGPathCloseSubpath(path); 
    CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor); 
    CGContextAddPath(ctx, path); 
    CGContextFillPath(ctx);

    // Drawing a line from control points 1 and 2
    CGContextBeginPath(ctx);
    CGContextSetRGBStrokeColor(ctx,1,0,0,1);
    CGMutablePathRef cp1 = CGPathCreateMutable(); 
    CGPathMoveToPoint(cp1, NULL, cp1x, cp1y); 
    CGPathAddLineToPoint(cp1, NULL, cp2x, cp2y); 
    CGPathCloseSubpath(cp1); 
    CGContextAddPath(ctx, cp1); 
    CGContextStrokePath(ctx);
}

- (void)adjustWave {
    [UIView beginAnimations:@"movement" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationWillStartSelector:@selector(didStart:context:)]; 
    [UIView setAnimationDidStopSelector:@selector(didStop:finished:context:)]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDuration:3.0f]; 
    [UIView setAnimationRepeatCount:3]; 
    [UIView setAnimationRepeatAutoreverses:YES]; 
    cp1x = cp1x + 20.0f;
    [UIView commitAnimations];
}

Die Form ändert sich nicht. Wenn ich dagegen den CA-Code herausnehme und in der letzten Methode ein einfaches `[self setNeedsDisplay] einfüge, ändert sich die Form, aber offensichtlich ohne CA. Können Sie mir helfen? Ich bin sicher, dass ich hier einen sehr grundlegenden Fehler mache Vielen Dank im Voraus, Davide

18voto

Brad Larson Punkte 169275

Wenn Sie dies für iPhone OS 3.x (oder Snow Leopard) schreiben, ist das neue CAShapeLayer-Klasse sollten Sie diese Art von Animation recht einfach durchführen können. Wenn Sie einen Pfad haben, der die gleiche Anzahl von Kontrollpunkten beibehält (wie in Ihrem Fall), können Sie diesen Pfad auf den CAShapeLayer setzen und dann die Pfadeigenschaft von diesem Startwert zu Ihrem endgültigen Pfad animieren. Core Animation führt die entsprechende Interpolation der Kontrollpunkte im Pfad durch, um ihn zwischen diesen beiden Zuständen zu animieren (mehr, wenn Sie eine CAKeyframeAnimation verwenden).

Beachten Sie, dass es sich hierbei um eine Ebene handelt, so dass Sie sie als Unterebene Ihrer UIView hinzufügen müssen. Außerdem glaube ich nicht, dass die Pfadeigenschaft implizit animiert, sodass Sie möglicherweise manuell eine CABasicAnimation erstellen müssen, um die Änderung der Form von Pfad 1 zu Pfad 2 zu animieren.

BEARBEITEN (11/21/2009): Joe Ricioppo hat einen netten Beitrag über CAShapeLayer geschrieben aquí , einschließlich einiger Videos, die diese Art von Animationen zeigen.

-1voto

duncanwilcox Punkte 3523

Sie können Ihre Form nicht mit CA animieren. Sie können in CA nur Ebeneneigenschaften animieren, keine benutzerdefinierten Eigenschaften.

CA kann schnell sein, weil es nicht auf Ihren Code zurückgreifen muss, um Animationen durchzuführen. Wenn Sie darüber nachdenken, wie es implementiert ist, ist es im Grunde nur ein Thread, der GL-Primitivoperationen mit CALayer-Frames und -Inhalten ausführt.

CA-Animationen sind eine Reihe von Anweisungen für CA, die im Hintergrund-Thread ablaufen, ausgelöst und vergessen werden (plus Rückruf bei Abschluss der Animation), keine Rückrufe an Ihren Code.

Um den Inhalt einer Ebene zu animieren, müsste CA Sie bei jedem Bild zum Zeichnen zurückrufen oder Ihnen Anweisungen geben, wie Sie zeichnen sollen. Beides ist nicht der Fall.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X