¿Cuáles son las diferencias entre UIView y CALayer?

103

Ambos tienen la mayoría de los mismos atributos, ambos admiten diferentes tipos de animaciones, ambos representan datos diferentes. ¿Cuáles son las diferencias entre UIView y CALayer?

Oleg Danu
fuente

Respuestas:

224

En iOS, cada UIView está respaldado por un CALayer de animación principal, por lo que está tratando con CALayers cuando usa un UIView, aunque no se dé cuenta. A diferencia de NSViews en Mac, que evolucionaron antes de que existiera Core Animation, las UIViews están diseñadas para ser envolturas ligeras alrededor de estos CALayers.

Como describo en la pregunta similar "¿Cuándo usar CALayer en Mac / iPhone?" , trabajar directamente con CALayers no le brinda ventajas de rendimiento significativas sobre UIViews. Una de las razones por las que podría querer crear un elemento de interfaz de usuario con CALayers en lugar de UIViews es que se puede portar muy fácilmente a Mac. Los UIViews son muy diferentes de los NSView, pero los CALayers son casi idénticos en las dos plataformas. Es por eso que el marco Core Plot presenta sus gráficos utilizando CALayers en lugar de otros elementos de la interfaz de usuario.

Una cosa que UIViews proporciona sobre CALayers es soporte integrado para la interacción del usuario. Manejan las pruebas de aciertos en los toques y otras acciones relacionadas que necesitaría construir usted mismo si administra una jerarquía de CALayers. No es tan difícil implementar esto usted mismo, pero es un código adicional que necesitaría escribir al construir una interfaz solo para CALayer.

A menudo, necesitará acceder a las capas subyacentes para una UIView cuando realice animaciones más complejas que las que permite la clase UIView base. Las capacidades de animación de UIView han crecido a medida que ha madurado el SDK de iOS, pero todavía hay algunas cosas que se hacen mejor interactuando con el CALayer subyacente.

Brad Larson
fuente
40

Del blog de Ray Wenderlich ( Tutorial )

Los CALayers son simplemente clases que representan un rectángulo en la pantalla con contenido visual. "Pero espera un maldito minuto", puedes decir, "¡para eso están las UIViews!" Eso es cierto, pero hay un truco: ¡cada UIView contiene una capa raíz a la que se dibuja!

Estera
fuente
33

Simplemente hablando, UIView hereda de UIResponder, maneja eventos de usuarios, contiene CALayer, que hereda de NSObject, se enfoca principalmente en renderizado, animación, etc.

Para descanso
fuente
7

UIViewes un contenedor para CALayers. Usando UIKit.

CALayerdonde dibujamos el contenido. UtilizandoCoreGraphics

Si trabaja con funciones similares a controles personalizados, sería genial seguir adelante con una vista única que contiene más capas para una representación nativa precisa. Ya que CALayersson ingrávidos que UIView.

Para crear un esqueleto común para Mac e iOS, siga el diseño de su aplicación usando CALayers. Dado que está disponible en ambas plataformas.

UIViewtener características como eventos táctiles logrados usando delegados -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event, tochesStartcomo eventos y otras UIKitcaracterísticas.

Para trabajar, CALayersuse el conocimiento de Core Graphics. Para cualquier vista simple, la representación UIViewes suficiente.

Gobi M
fuente
0

La gran diferencia es que UIView está diseñado para CocoaTouch en dispositivos móviles. Agrega algún controlador de eventos que CALayer no proporcionó.

musixlemon
fuente
0

UIView: las vistas tienen diseños de jerarquía más complejos. Pueden recibir interacciones del usuario como toques, pellizcos, clics y más. Trabajar con UIViews ocurre en el hilo principal, significa que está usando la potencia de la CPU.

CALayer: Las capas, por otro lado, tienen una jerarquía más simple. Eso significa que son más rápidos de resolver y más rápidos de dibujar en la pantalla. No hay una sobrecarga de la cadena de respuesta a diferencia de las vistas. Las capas se dibujan directamente en la GPU. Ocurre en un hilo separado sin sobrecargar la CPU.

Para más detalles: https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5

Anit Kumar
fuente