UIView Animation gegen CALayers

75

Ich habe Probleme mit der Konzeption von Animationen mit einem CALayer im Gegensatz zu UIViews eigenen Animationsmethoden. Werfen Sie " Core Animation " in diese und vielleicht kann jemand diese Konzepte von einer hohen Ebene aus artikulieren, damit ich besser visualisieren kann, was passiert und warum ich UIView-Animationen (mit denen ich jetzt ziemlich vertraut bin) nach CALayer migrieren möchte Animationen auf dem iPhone. Jede Ansicht in Cocoa-Touch erhält automatisch eine Ebene. Und anscheinend können Sie den einen und / oder den anderen animieren ?!? Sogar zusammen mischen?!? Aber wieso? Wo ist die Leitung? Was ist das Für / Wider für jeden?

Der Core Animation Programming Guide springt sofort in Layer & Timing Classes und ich denke, wir müssen einen Schritt zurücktreten und verstehen, warum diese verschiedenen Teile existieren und wie sie miteinander zusammenhängen.

Meltemi
quelle
3
Dies war eine ausgezeichnete allgemeine Frage, und alle Antworten sind ausgezeichnet. Ich habe alle in diesem Thread gewählt.
Mobibob
Gute Frage. Kennt jemand Best Practice zum Animieren des CALayer eines UIView? In meinem Beispiel benötige ich einen 3D-Effekt, und beim Animieren der Ebene wird der 'Rahmen' der UIView falsch mit der Ebene ausgerichtet (bei einer Schaltfläche stimmen die Taps also nicht mehr überein).
Marc

Antworten:

55

Verwenden Sie Ansichten zur Steuerung und Ebenen für Augenweiden. Ebenen erhalten keine Ereignisse, daher ist es einfacher, eine Ansicht für diese Fälle zu verwenden. Wenn Sie jedoch ein Sprite oder Hintergründe usw. animieren möchten, sind Ebenen sinnvoll. Ereignisse werden direkt durch Ebenen in die Hintergrundansicht geleitet, sodass Sie eine hübsche visuelle Darstellung erhalten, ohne Ihre Ereignisse durcheinander zu bringen. Versuchen Sie, eine Ansicht zu überlagern, die Sie nur für die visuelle Darstellung verwenden, und Sie müssen Tap-Ereignisse selbst an die zugrunde liegende Ansicht weiterleiten.

Matt Long
quelle
Dies ist eine großartige Antwort. Vielen Dank!
Warpling
25

An UIViewwird immer zu a gerendert CALayer. Wenn Sie UIViewMethoden zum Animieren einer Ansicht verwenden, manipulieren Sie den Basiswert effektiv CALayer.

Wenn Sie einfache Dinge tun müssen, verwenden Sie die UIViewMethoden. Verwenden Sie für komplexere Situationen oder wenn Sie Ebenen möchten, die keiner bestimmten Ansicht zugeordnet sind CALayers.

Marco Mustapic
quelle
21

Ich habe im letzten Jahr eine Reihe von Apps erstellt. Hier ist meine Faustregel:

  1. Verwenden Sie UIView, bis es nicht mehr das tut, was Sie wollen.
  2. Wechseln Sie dann zu CoreAnimation. Aber bevor Sie sich zu sehr darauf einlassen ...
  3. Wenn Sie mehr als ein paar Animationen schreiben, verwenden Sie Cocos2D.
Chris Garrett
quelle
Was macht Cocos2D besser? Haben Sie dann keine anderen Probleme mit der Behandlung von Berührungsereignissen und vielen anderen Dingen, die in openGL ES fehlen?
Danke
Cocos2D bietet viele praktische Methoden, sodass Code viel kompakter ist. Sie haben einige großartige integrierte Effekte. Kurz gesagt, wenn Sie eine Reihe von Animationen ausführen, schreiben Sie weniger Code als OpenGL ES oder Core Animation, wenn Sie Cocos2D verwenden. Sie haben ihre eigenen Methoden zur Handhabung von Berührungen, das ist also überhaupt kein Problem.
Chris Garrett
13
Mein Vorschlag ist, Cocos2D nur zu verwenden, wenn Sie ein Spiel schreiben. Ich denke, das ist wirklich der beste Anwendungsfall. Ich bin jedoch damit einverstanden, dass Sie UIView-Animationen so lange wie möglich verwenden und für alles, was darüber hinausgeht, CoreAnimation verwenden.
Jonathan Sterling
9

UIView-Transformationen sind nur 2D-Transformationen und darauf beschränkt. LAyer-Transformationen können jedoch 3D-Transformationen sein. Sie sollten diese verwenden, wenn Sie 3D-Arbeiten ausführen möchten. UIView-Animationen funktionieren, wenn Sie entweder die UIView-Transformation oder die CALayer-Transformation ändern. Grundsätzlich können Sie also viel mehr Manipulationen vornehmen, wenn Sie mit einer Ebene anstatt mit der Ansicht arbeiten.

Daniel
quelle
2

Ich bin mir nicht sicher, ob ich Chris 'Antwort auf "Was macht Cocos2D besser? Haben Sie dann keine anderen Probleme in Bezug auf die Behandlung von Berührungsereignissen und viele andere Dinge, die in openGL ES fehlen?" Missverstehe.

Die Antwort deutet darauf hin, dass Cocos2D nicht auf dem OpenGL ES-Framework basiert, obwohl es tatsächlich aktuell ist. Obwohl es sich um eine großartige 2D-Spiel-Engine handelt, implementiert sie OpenGL für einen Großteil des Renderings - verbunden mit einer Physikbibliothek - und bietet viele sehr interessante Animationsmöglichkeiten - und Chris hat Recht - es ist in der Tat viel weniger Codierung.

TouchGameDev
quelle