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?
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.
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!
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.
UIView
ist ein Behälter für CALayers
. Verwenden von UIKit
.
CALayer
wo 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 CALayers
sind 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.
UIView
wie Touch - Ereignisse mit Feature Delegierten erreicht mit -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
, tochesStart
wie Ereignisse und anderen UIKit
Funktionen.
Um mit der CALayers
Verwendung von Core Graphics-Kenntnissen zu arbeiten. Für jede einfache Ansicht reicht das Rendern UIView
aus.
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.
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