CABasicAnimation nicht animieren mein Eigentum
Ich habe versucht zu verstehen, was falsch mit meiner animation und ich habe noch nicht herausfinden. Ich denke, es sollte wirklich geradlinig, aber es ist wahrscheinlich etwas, was ich bin fehlt, auch nach der Lektüre viele Beispiele und Dokumentation.
Mein problem kommt ursprünglich form die Tatsache, dass auf dem iPhone, können Sie die Größe ändern Ebenen automatisch (mit dem Blick). Die Dokumentation etwas anderes sagt, aber es gibt keine autoresizeMask für die Ebene in der SDKs. So entschied ich mich zu einem kleinen workaround und animieren die Ebene selbst.
Habe ich dieses einfache Stück code, das sollte eine simple resize-animation. Die Werte sind gut und ich bin sogar der Delegat, um zu verfolgen, wenn die anim start/Ende.
//I've got a property named layerImage (which is a CALayer)
- (void)animateTestWithFrame:(CGRect)value {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"layerImage.frame"];
animation.duration = 1;
animation.fromValue = [NSValue valueWithCGRect:self.frame];
animation.toValue = [NSValue valueWithCGRect:value];
animation.removedOnCompletion = YES;
animation.delegate = self;
[self.layer addAnimation:animation forKey:@"layerImage.frame"];
}
So, irgendwelche Ideen? (Diese Ansicht, die den code enthält, ist die Untersicht eine Untersicht des Fensters, wenn das einen Unterschied machen kann)
--- EDIT ---
Es scheint, der Rahmen ist nicht animierbar über CABasicAnimation und die benannte Eigenschaft "frame". Bei der Verwendung Grenzen, ich habe etwas seltsames Ergebnis, aber ich bin zumindest immer etwas. Weiterhin die Untersuchung auf diese.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, es ist gut, dass Sie bemerkt haben Dinge hier, aber Ihre Antwort auf Ihre eigene Frage hat einige Ungenauigkeiten. Lassen Sie mich korrigieren, ein paar Dinge:
Die frame-Eigenschaft kann animiert werden-nur nicht mit expliziten animation. Wenn Sie Folgendes tun, um einer anderen Ebene als die root-Ebene einer Ansicht, die frame animieren das gut:
Denken Sie daran, dass das setzen einer Eigenschaft auf einer Ebene wird animieren Sie diese Eigenschaft ändern standardmäßig. In der Tat haben Sie zum deaktivieren der Animationen auf einem Grundstück ändern, wenn Sie nicht wollen, es zu animieren. (Natürlich ist dies nur der Fall, wenn Sie eine Ebene animieren möchten, andere als die root-Ebene einer Ansicht.) Sie sind richtig bei der Animation die position und die Grenzen, wenn Sie müssen, verwenden Sie eine explizite animation.
Du kann animieren Sie den Rahmen auf einer UIView implizite animation:
Dies animiert aus der Sicht der aktuelle Rahmen (Grenzen und position) bei x = 45.0, y = 45.0, w = 100.0, h = 100.0.
Es scheint, Sie kann auch Missverständnisse ist der Unterschied zwischen einer animation und einer Ebene. Hinzufügen von Animationen zu Schichten, aber das hinzufügen einer animation zu einer Schicht nicht automatisch die Eigenschaft, dass Sie animieren.
CALayers sind model-Objekte. Sie enthalten Informationen über die Ebene, schließlich wird dargestellt, um den Bildschirm. Sie muss festlegen einer layer-Eigenschaft, wenn Sie wollen, dass diese Eigenschaft wirklich Wert. Wenn Sie einfach animieren Sie die Eigenschaft, es wird nur eine visuelle Darstellung und nicht von der tatsächlichen-und das ist zu sagen, das ist, warum der Wert schnappt zurück auf den ursprünglichen Wert von der Ebene, weil Sie eigentlich nie geändert.
Das führt mich zum nächsten Punkt. Sie sagte:
Dies ist nicht genau richtig. Diese beiden Werte einfach die animation bleibt bei seiner endgültigen position optisch, aber die Ebene, die tatsächlichen Werte sich nicht geändert haben. Sie sind immer noch die exakt gleichen Werte, die Sie waren, als Sie anfingen, die animation. Im Allgemeinen (mit wenigen Ausnahmen) Sie nicht möchten, verwenden Sie diese beiden Parameter, da Sie visual nur. Was Sie wollen, ist eigentlich die Ebene mit dem Wert für die Eigenschaft sind Sie zu animieren.
Sagen, zum Beispiel, dass Sie möchten, animieren Sie die position der Ebene eine explizite animation. Hier ist der code, den Sie möchten:
Können Sie auch wollen, um die animation betrachten zu gruppieren. Mit einer Gruppe animation können Sie mehrere Animationen zusammen und dann kontrollieren, wie Sie miteinander in Beziehung. In Ihrem Fall ist die Dauer für Ihre Grenzen und die position, die Animationen sind die gleichen, und so, was Sie versuchen zu tun, die funktionieren, ohne eine Gruppe, aber wenn Sie wollen, um den offset der start der Animationen, zum Beispiel, die Sie nicht wollen, dass die position, die animation zu starten, bis ein oder zwei Sekunden in die frame-animation, Sie könnte taumeln, indem Sie die beginTime Wert der position-animation.
Schließlich, ich wäre neugierig zu wissen, warum Sie nicht verwenden können, die implizite Animationen verfügbar, die auf UIView. Ich benutze diese in der überwiegenden Mehrheit der Core-Animation-code, den ich Schreibe, und kann nicht sehen, warum dies nicht funktionieren würde für Ihre situation.
Beste Grüße.
Pfad der Schlüssel sollte nur der Pfad der Schlüssel der Eigenschaft, nicht der name des Objekts als auch.
Verwenden Sie diese
stattdessen
Und nur BTW, wenn Sie eine animation hinzufügen einer Ebene, der Schlüssel doen nicht, dass die key-Eigenschaft zu animieren. Nur der key (name), dass Sie wollen, dass diese animation zu haben (dies bezieht sich auf die Letzte Zeile des Codes)
So, die Lösung war zu animieren @"Grenzen" und die @"position" der Ebene, weil Rahmen ist nicht animierbar auf dem iPhone. Es hat einige Zeit gedauert zu verstehen, dass die Lage der Mitte der Ebene und die Größe der Schranken war, die sich von der Mitte, aber das war der einfache Teil.
So, was ich gemacht habe im Lebenslauf war:
War ich nicht in der Lage zu verwenden, die UIView animation-system direkt, denn es war nicht das tun, was ich wollte, auf den Lagen.
Dank tadej5553 für den Hinweis, mir das Ebene problem hatte ich mit der "addAnimation". So hier ist der code für diejenigen, die wollen sehen, wie es aussieht.