Wie funktionieren iOS-Animationsblöcke?

8

In iOS können Sie Animationsobjekte verwenden Animationsblöcke:

%Vor%

Was wir hier haben, ist ein Codeblock, der beschreibt, was die Ansichtseigenschaften sehen werden, nachdem die Animation beendet ist.

Wie funktioniert das?

Ich könnte verstehen (denke ich), wenn dies mit einem deklarativen Format gemacht wurde, aber nach dem Aussehen ist der Animationsblock nur ein normales Stück Code, das vermutlich ausgeführt werden muss, die Ergebnisse werden inspiziert und dann jemand transcodiert in den eigentlichen Grafikcode der unteren Ebene, der die Animation ausführt.

Wird der Block tatsächlich ausgeführt (oder irgendwie reverse-engineered) und wenn ja, wann?

Wenn dieser Code vor Beginn der Animation ausgeführt wird, wie werden dann die Änderungen an den Eigenschaften der referenzierten Ansicht nicht sofort angezeigt?

Was passiert, wenn ich Code in den Block lege, der die Ansichtseigenschaften nicht ändert, aber etwas anderes tut?

    
Thilo 13.07.2012, 08:54
quelle

3 Antworten

8

Ja, der Block wird tatsächlich aufgerufen - dann werden die Eigenschaften der Ansicht sofort geändert. Die Property Setter der UIView sind dafür verantwortlich, zu sehen, ob das Set innerhalb eines Animationskontexts verwendet wurde. Wenn dies der Fall ist, berechnen sie die Animationsframes usw. mit CoreAnimation und CoreGraphics.

Wenn Sie Nicht-Animations-Code in diese Blöcke schreiben, passiert nichts Besonderes - der Block wird sofort ausgeführt.

    
user529758 13.07.2012, 08:57
quelle
6

Es ist lehrreich, den äquivalenten Code vor den Blöcken zu betrachten:

%Vor%

Sie sehen also, dass auch vor den Blöcken die zu ändernden Eigenschaften direkt festgelegt werden; sie werden jedoch nicht sofort wirksam (sie sind animiert).

Wie funktioniert es? Vermutlich, wenn Sie eine Eigenschaft auf die Ansicht setzen, überprüft sie, ob Sie beginAnimations , aber nicht commitAnimations ausführen, und wird nicht sofort wirksam, wenn dies der Fall ist (sondern fügt sie stattdessen der Liste der zu animierenden Objekte hinzu.) diese Animation).

Was die Block-Version macht, ist im Zusammenhang mit der Pre-Block-Version sehr einfach: Sie können es sich einfach so vorstellen, dass sie den Animationsblock in beginAnimations und commitAnimations lines ausführt.

    
newacct 14.07.2012 20:46
quelle
1

Apple spricht nicht wirklich über die wesentlichen Details, wie es funktioniert, aber hier ist, was ich denke passiert:

Das System fügt KVO-Beobachter zu allen animierbaren Eigenschaften einer Ansicht hinzu, wenn die Ansicht der Ansichtshierarchie hinzugefügt wird.

Wenn Ihr Animationsblock ausgeführt wird, legt das System einen Status fest, der nach KVO-Benachrichtigungen für diese Eigenschaften sucht. Der Code, der dann aufgerufen wird, erstellt und fügt die entsprechenden CAAnimation-Objekte zur Ebene der jeweiligen betroffenen Ansicht hinzu.

    
Duncan C 13.07.2012 15:36
quelle