Was sind die Unterschiede zwischen einem UIView und einem CALayer?

103

Beide haben die meisten gleichen Attribute, beide unterstützen unterschiedliche Arten von Animationen, beide repräsentieren unterschiedliche Daten. Was sind die Unterschiede zwischen einem UIView und einem CALayer?

Oleg Danu
quelle

Antworten:

223

Unter iOS wird jedes UIView von einem Core Animation CALayer unterstützt, sodass Sie bei der Verwendung eines UIView mit CALayers arbeiten, auch wenn Sie dies möglicherweise nicht bemerken. Im Gegensatz zu NSViews auf dem Mac, die vor der Existenz von Core Animation entwickelt wurden, sollen UIViews leichte Wrapper für diese CALayer sein.

Wie ich in der ähnlichen Frage "Wann soll CALayer auf dem Mac / iPhone verwendet werden?" Beschreibe. Wenn Sie direkt mit CALayers arbeiten, erhalten Sie keine signifikanten Leistungsvorteile gegenüber UIViews. Einer der Gründe, warum Sie möglicherweise ein Benutzeroberflächenelement mit CALayers anstelle von UIViews erstellen möchten, besteht darin, dass es sehr einfach auf den Mac portiert werden kann. UIViews unterscheiden sich stark von NSViews, aber CALayers sind auf beiden Plattformen nahezu identisch. Aus diesem Grund legt das Core Plot-Framework seine Diagramme mithilfe von CALayers anstelle anderer UI-Elemente an.

Eine Sache, die UIViews über CALayers bieten, ist die integrierte Unterstützung für die Benutzerinteraktion. Sie führen Trefferprüfungen für Berührungen und andere verwandte Aktionen durch, die Sie selbst erstellen müssten, wenn Sie eine Hierarchie von CALayern verwalten. Es ist nicht so schwer, dies selbst zu implementieren, aber es ist zusätzlicher Code, den Sie schreiben müssen, wenn Sie eine Nur-CALayer-Schnittstelle erstellen.

Sie müssen häufig auf die zugrunde liegenden Ebenen für eine UIView zugreifen, wenn Sie komplexere Animationen ausführen, als es die Basis-UIView-Klasse zulässt. Die Animationsfunktionen von UIView sind mit der Reifung des iOS SDK gewachsen, aber es gibt noch einige Dinge, die am besten durch die Interaktion mit dem zugrunde liegenden CALayer erreicht werden können.

Brad Larson
quelle
40

Aus dem Ray Wenderlich Blog ( Tutorial )

CALayer sind einfach Klassen, die ein Rechteck auf dem Bildschirm mit visuellem Inhalt darstellen. "Aber warte eine verdammte Minute", können Sie sagen, "dafür sind UIViews da!" Das stimmt, aber das hat einen Trick: Jedes UIView enthält eine Wurzelebene, auf die es zeichnet!

Matte
quelle
33

Einfach ausgedrückt, UIView erbt von UIResponder, verarbeitet Ereignisse von Benutzern, enthält CALayer, die von NSObject erben, konzentriert sich hauptsächlich auf Rendering, Animation usw.

Wald
quelle
7

UIViewist ein Behälter für CALayers. Verwenden von UIKit.

CALayerwo wir den Inhalt zeichnen. Verwenden vonCoreGraphics

Wenn Sie mit benutzerdefinierten Steuerelementfunktionen arbeiten, ist es hilfreich, eine Einzelansicht mit mehr Ebenen für ein genaues natives Rendering zu erstellen. Da CALayerssind schwerelos als UIView.

Befolgen Sie zum Erstellen eines gemeinsamen Skeletts für Mac und iOS das Design für Ihre App mit CALayers. Da es auf beiden Plattformen verfügbar ist.

UIViewwie Touch - Ereignisse mit Feature Delegierten erreicht mit -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event, tochesStartwie Ereignisse und anderen UIKitFunktionen.

Um mit der CALayersVerwendung von Core Graphics-Kenntnissen zu arbeiten. Für jede einfache Ansicht reicht das Rendern UIViewaus.

Gobi M.
quelle
0

Der große Unterschied besteht darin, dass UIView für CocoaTouch auf Mobilgeräten entwickelt wurde. Es wird ein Ereignishandler hinzugefügt, den CALayer nicht bereitgestellt hat.

Musixlemon
quelle
0

UIView: Ansichten haben komplexere Hierarchie-Layouts. Sie können Benutzerinteraktionen wie Tippen, Kneifen, Klicken und mehr empfangen. Die Arbeit mit UIViews erfolgt im Hauptthread, dh es wird CPU-Leistung verbraucht.

CALayer: Ebenen hingegen haben eine einfachere Hierarchie. Das heißt, sie lassen sich schneller auflösen und schneller auf dem Bildschirm zeichnen. Anders als bei Ansichten gibt es keine Overhead-Kette für Responder. Ebenen werden direkt auf der GPU gezeichnet. Dies geschieht in einem separaten Thread, ohne die CPU zu belasten.

Für weitere Informationen: https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5

Anit Kumar
quelle