1

Dies ist mit vielen kleinen Bugs verbunden, die stereotypisch von einer Person als geringfügig betrachtet werden könnten, aber von einer anderen als wichtig.Wann ist es angebracht, Core-Animation über UIView-Animation in häufigen Fällen zu verwenden?

Was ich immer mehr bemerkt haben, ist, dass, wenn alle Aromen mit einem UIView animateWithDuration:, es ändert tatsächlich Dinge unnötig, wie mehrere Eigenschaften meiner Ansichten, eine einfache hide/offenbaren Stil Animationen zu tun, etc ..

Die Dinge scheinen in Szenarios wie einer UINavigationBar, die für einen bestimmten Rotationsübergang nicht richtig in die Position animiert, oder einer Header-Ansicht, die bei der Rahmenaktualisierung nicht zusammen mit der Statusleiste animiert wird, wenn die Unterlayer einer Ansicht implizit zu anderen Zeiten implizit animieren würden Die Eigenschaften der übergeordneten Ansicht ändern sich ...

So viele von diesen habe ich erneut besucht und zu CAAnimations konvertiert, weil Sie scheinen einfacher zu verwalten zu sein, da sie nicht die Zieleigenschaftswerte meiner Ansichten ändern.

Ein einfaches Beispiel ist die Verwendung [view setHidden:], und dann animieren oder nicht oder aber die Ansicht ist tatsächlich bereits sichtbar oder ausgeblendet, während die Animation ausgeführt wird.

Ein anderes Wesen, die Notwendigkeit zu verwandeln/drehen/Maßstab eine Ansicht des UINavigationController und unter Verwendung einen CAAnimation, es zu tun, weil die UINavigationBar es bewegt sich nicht korrekte Position ist, wenn ich die UINavigationController Ansicht ändern, und jede davon ist Mutter Werte der transform-Eigenschaft der Ansicht

Also abschließend zu dieser Frage, ich bin hin und her gewesen, und habe Plätze gefunden, wo man für meine Verhältnisse passender ist als der andere, aber hauptsächlich möchte ich hören, was andere über diese Szenarien denken, und Wenn es einen Einblick in das gibt, was Apple mir zur Verfügung gestellt hat, kann ich mich über meine Ansätze besser fühlen.

Vielen Dank im Voraus.

Antwort

5

Am Ende des Tages werden alle Animationen im UIKit-Stil in Animationen im Core Animation-Stil umgewandelt. das heißt, alles wird tatsächlich mit Core Animation animiert. Der Unterschied zwischen den APIs besteht hauptsächlich in der Bequemlichkeit: UIKit-ähnliche Animationsfunktionen aktualisieren den Modellwert, indem sie eine Animation festschreiben, um diese Änderung im Laufe der Zeit in der Präsentationsebene widerzuspiegeln.

Sie müssen auch darauf achten, dass Sie Eigenschaften animieren, die laut UIKit animiert werden können. Zum Beispiel, während Sie Eigenschaften auf UIScrollView wie contentSize und contentOffset technisch animieren können, werden sie offiziell nicht unterstützt, also müssen Sie möglicherweise mit Nebenwirkungen umgehen.

Darüber hinaus ist frame ein Sonderfall, weil es eigentlich eine abgeleitete Eigenschaft, bestehend aus center, transform und bounds (zusätzlich zu anchorPoint auf CALayer, die UIView aussetzt nicht). Das Animieren eines Views frame kann eine ganze Reihe von unbeabsichtigten Problemen haben, normalerweise mit Rotation. Core Animation hat dieses Problem nicht, da frame keine explizit animierbar Eigenschaft auf CALayer ist. Versuchen Sie, in UIKit-artigen Animationen bounds und center zu verwenden, wenn Sie seltsames Verhalten bei der affinen Transformation (z. B. Skalierung, Translation, Rotation) dieser Ansicht feststellen.

Es ist richtig, dass das Animieren bestimmter Ansichten in UIKit unbeabsichtigte Nebenwirkungen oder Fehler aufweist, da Sie neben der Animation auch Modellwerte aktualisieren.Core Animation dagegen ist ein wenig flexibler, da Sie genau steuern können, wie und wann es entweder die Model-Ebene oder die Präsentationsebene aktualisiert.

Aber ich würde nicht zustimmen, dass UIKit Dinge unnötig verändert. Es ändert, was es ändern muss, um die von Ihnen angeforderten animierten Änderungen zu übernehmen und seine Modellwerte zu aktualisieren. Wenn Sie Eigenschaften wie frame animieren, ruft dies implizit layoutSubviews() für diese Ansicht nach der aktuellen Ausführungsschleife auf, die auf andere Unteransichten kaskadieren kann und so weiter.

Wenn Sie möchten, dass UIKit die gesamte Layout-Logik vor der Animation ausführt, rufen Sie setNeedsLayout() zusammen mit layoutIfNeeded() auf, bevor Sie einen Animationsblock aufrufen. Wenn Sie möchten, dass UIKit zur gleichen Zeit, zu der Ihre Animation übergeben wird, tatsächlich die Änderungen der gesamten Unteransichtshierarchie animiert, geben Sie die Option UIViewAnimationOptions.layoutSubviews an. Dadurch wird das Unteransichtslayout sofort innerhalb des Animationsblocks ausgelöst, sodass diese Werte ebenfalls animiert werden. Andernfalls werden die Modellwerte, die von Ihrer Animation geändert werden, Layoutaktualisierungen für die nächste Ausführungsschleife auslösen.

Im Allgemeinen bemerke ich selten Probleme mit UIKit-Stil Animation Funktionen. Als jemand, der viel Zeit mit der Animation auf iOS verbracht hat, würde ich sagen:

Verwenden Sie UIKit-Stil Animationen an jedem Ort können Sie, da sie wirklich bequem sind. Animationen im Core-Animationsstil sollten verwendet werden, wenn Probleme mit Animationen im UIKit-Stil auftreten oder wenn Sie eine bestimmte Kontrolle darüber benötigen, wie die Modell- und Präsentationswerte einer Ebene aktualisiert werden müssen.

Verwandte Themen