layoutSubviews während einer animation?
Ich habe eine UIView
mit einem Bündel von Untersichten, alle positioniert Verwendung layoutSubviews
. Wenn die view
geändert wird, die relativen Positionen verändern sich. Ich möchte diese re-Berechnungen, um zu passieren, während eine animierte verkleinern (mit +[UIView beginAnimations:]
Anrufe). Dies scheint nicht passiert zu sein. Irgendwelche Ideen?
InformationsquelleAutor Ben Gottlieb | 2010-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Annahme: Sie möchten mehrere Animations-Schritte (d.h. die position ändert sich nicht Linear mit der Bildgröße).
Dies ist nicht möglich, mit einer einzigen "standard" UIView-Animationen. Warum? Die frame/bounds ist nur einmal erforderlich.
Core Animation hat drei "layer-Bäume":
UIView ist die (etwas dünne) wrapper für die Modell-Ebene. Während einer UIView animation, Core Animation updates der Präsentation/render-tree — Modell-Baum stellt den Endpunkt der Animationen. Das Ergebnis ist, dass Ihr code kann (zum größten Teil) behandeln Animationen als unmittelbare bewegende Blick von A nach B sofort bewegt es zu B; die Veränderung passiert einfach zu sein, animiert den Nutzer.
Es gibt mehr komplizierte Dinge, die Sie tun können, mit CALayer/CAAnimation direkt, aber ich habe nicht untersucht, soviel dazu.
Könnten Sie die Kette mehrere Animationen zusammen mit -[UIView setAnimationDidStopSelector:]. (Sie könnten auch versuchen, mehrere Animationen zusammen mit setAnimationDelay:, aber ich bin mir nicht sicher, was passiert mit mehrere Animationen für die gleiche Eigenschaft; Sie könnten Glück haben, mit setAnimationBeginsFromCurrentState:.)
Wenn Sie wirklich eine fein abgestimmte Kontrolle, CADisplayLink (OS 3.1+) ist ein timer, feuert nach jedem Bildschirm-refresh. Eine fallback-option (für 3.0-Unterstützung), ist die Verwendung eines NSTimer 30/60 Hz oder so.
InformationsquelleAutor tc.
Ich weiß, das ist eine alte Frage, aber dieser code funktioniert für mich sehr gut (geeignet für dein Beispiel der sich verändernden Rahmen -).
Natürlich können Sie den Aufruf dieser Methode aus einem anderen Objekt. Der "trick" ist zu nennen, layoutIfNeeded (oder layoutSubviews direkt - gleiche Sache, wenn Sie ändern Sie den Rahmen der setNeedsLayout genannt wird).
Als tc. schön erklärt die "layer-Bäume", die Sie gerade Kraft der presentation layer Anzeige der letzten Phase der Modell-Ebene mit animation.
Der Vorteil dieser Methode liegt in der Möglichkeit, zu kontrollieren, wenn der frame/bounds ändern ist animiert und wenn es instant.
Hoffe, das jemand hilft:).
meine Freude 🙂
Vielleicht benötigen, rufen Sie setNeedsLayout vor layoutIfNeeded.
Naja...es hängt davon ab, welche Attribute geändert werden. Dennoch sollte es eingestellt werden, automatisch, oder der Umsetzung der Veränderung dieses Attributs sollte sich darum kümmern. Zum Beispiel, wenn Sie ändern frame/bounds/Mitte der setNeedsLayout genannt wird. Auf diese Weise brauchen Sie nicht zu tun, layout-Berechnungen, wenn es keine änderungen im layout.
Sie bekommen genau den gleichen Effekt, indem Sie die UIViewAnimationOptionLayoutSubviews animation option, so dass Sie nicht brauchen, um Anruf layoutIfNeeded.
InformationsquelleAutor JakubKnejzlik
Abschluss @GrizzlyNetch die Antwort, können Sie die
UIViewAnimationOptionLayoutSubviews
animation option, so brauchen Sie nicht zu nennenlayoutIfNeeded
:InformationsquelleAutor quentinadam
Posting auf Vollständigkeit. Dank tc. zur Erklärung, was ich tun möchte, genau das wird nicht unterstützt von Core Animation.
Kam ich irgendwann auf eine vernünftige Lösung. Dann lieber das layout meiner Untersichten in -layoutSubviews, ich also in -setBounds:. Dann, wenn ich wrap-a-setBounds: rufen Sie in einer UIView +beginAnimations: block, diese Positionierung Anrufe sind auch animiert, und das Endergebnis ist alles richtig animieren, wo es sollte, Gott.
view.frame = blah; [view layoutIfNeeded]
Nein, das wird einfach verschieben Sie Sie in position, und dann animieren die Grenzen. Das ist es, was ich versuchte zunächst.
Ich versuche, etwas zu erreichen, ähnlich, aber mein setBounds wird nur einmal aufgerufen (mit den endgültigen Grenzen), so dass meine subviews nicht bekommen, neu ausgerichtet während der animation. Gibt es irgendetwas, was ich verpasst?
Vielen Dank für die -setBounds trick. Ich benutze-setFrame: da ändere ich auch die Herkunft, aber die Idee ist die gleiche. Legen Sie sich die Ansichten im layoutSubviews verursacht viele Probleme in meinem Fall, denn es heißt sehr oft zerstört meine Animationen.
InformationsquelleAutor Ben Gottlieb