objective framework developer apple ios core-animation core-graphics

framework - swift ios documentation



La relación entre CoreGraphics, UIViews y CALayers (1)

Trataré de responder a tu pregunta a un nivel conceptual de 20,000 pies. Trataré de negar mis puntos donde estoy generalizando en exceso, pero intentaré atacar el caso común.

Quizás la manera más fácil de pensarlo es esta: en la memoria de la GPU tiene texturas que, a los fines de esta discusión, son imágenes de mapa de bits. Un CALayer puede tener una textura asociada, o puede que no. Estos casos corresponderían a una capa con un método -drawRect: y una capa que existe únicamente para contener subcapas, respectivamente. Conceptualmente, cada capa que tiene una textura asociada tiene una textura diferente por sí misma (hay algunos detalles y optimizaciones que hacen que esto no sea estrictamente / universalmente cierto, pero en el caso abstracto general, puede ayudar pensar en esto ). Teniendo esto en cuenta, el método -drawRect: un superlayer no tiene efecto en ninguno de sus subcapas -drawRect: métodos, y (de nuevo, en el caso general) el método -drawRect: una subcapa no tiene efecto en su superlayer- -drawRect: método. Cada uno dibuja en su propia textura (también llamada "backing store") y luego, en función del árbol de capas y las geometrías y transformaciones asociadas, la GPU reúne todas estas texturas juntas en lo que se ve en la pantalla. Cuando una de las capas se invalida, directa o indirectamente (a través de -setNeedsDisplayInRect: , cuando CA va a mostrar el siguiente fotograma en la pantalla, las capas no válidas se redibujarán en virtud de que se -drawRect: sus métodos -drawRect: . Eso actualizará la textura asociada, y una vez que todas las texturas de las capas no válidas se actualicen, la GPU las compondrá, generando el mapa de bits final que se ve en la pantalla.

Entonces, para responder a su primera pregunta: En el caso general, no, no hay interacción entre los métodos -drawRect: de distintos CALayers.

En cuanto a su segunda pregunta: a los fines de esta discusión, puede pensar que UIViews es lo mismo que CALayers. La interrelación con respecto al dibujo y las texturas no ha cambiado en gran medida desde la de los CALayers no UIView.

A su tercera pregunta: ¿es una buena idea mezclar UIViews y CALayers? Cada UIView tiene un CALayer que lo respalda (todas las vistas en UIKit están respaldadas por capas, lo que normalmente no es el caso en OSX). Por lo tanto, en cierto nivel, están "entremezcladas" tanto si quieres como si no. Está perfectamente bien agregar subcapas CALayer a la capa que respalda un UIView, aunque esa capa no tendrá todas las funciones adicionales que UIView brinda a la fiesta. Si el propósito de esa capa es solo generar una imagen para mostrar, entonces está bien. Si desea que la subcapa / vista sea un participante de primera clase en el manejo táctil, o que se coloque / clasifique usando AutoLayout, entonces deberá ser un UIView. Probablemente sea mejor pensar en un UIView como un CALayer con un montón de funcionalidades adicionales. Si necesita esa funcionalidad, use un UIView. Si no lo hace, use un CALayer.

En resumen: CoreGraphics es una API para dibujar gráficos 2D. Un uso común de CG (pero no el único) es dibujar imágenes de mapa de bits. CoreAnimation es una API que proporciona un marco organizado para manipular bitmaps en pantalla. Podría utilizar CoreAnimation de manera significativa sin llamar nunca a una primitiva de dibujo CoreGraphics, por ejemplo, si todas sus texturas estuvieran respaldadas por imágenes compiladas en su aplicación en tiempo de compilación.

Espero que esto sea útil. Deje comentarios si necesita una aclaración, y editaré para obligar.

Siempre utilicé CoreGraphics y CoreAnimation, entiendo cómo cada uno de ellos funciona por sí mismo, pero no en aquellos casos extremos en los que uno tiene que hablar con el otro. También entiendo que UIView s es una buena envoltura para CALayer , donde CALayer hace todo el trabajo pesado de renderizado, y UIView agrega la capacidad de respuesta táctil.

Pero, todas las preguntas que he visto hasta ahora, atacan el problema de un lado o del otro, no la interacción entre ellos, especialmente entre CALayer y CALayer .

De todos modos, mi pregunta es ...

¿Cómo se relaciona CoreGraphics con CALayer?

CALayer entiendo, un CALayer ajusta los métodos de CALayer para dibujarse a sí mismo, pero lo hace una vez, y puede vivir con la instantánea de sí mismo hasta que se invalide. Pero, ¿cómo estos métodos de dibujo interactúan con las subcapas de esa capa? ¿Son exclusivos?

Por ejemplo, ¿qué sucede cuando tengo una UIView que tiene UIView , y sobrecarga el método drawRect ? ¿Cómo afecta eso el dibujo de sus subcapas?

¿Es incluso una buena idea mezclar los dos dentro de la misma función?

Además, solo estoy preguntando por iOS , entiendo que Mac es una bestia diferente (¡y también tienen esos sofisticados CIFilters , bastardos!).

Investigaciones anteriores

Aquí hay algunas preguntas relacionadas que he investigado de antemano:

  1. confusión con quartz2d, ​​gráficos centrales, animación central, imágenes centrales . Esta pregunta pregunta las diferencias entre sí, y la respuesta elegida realmente se cumple, pero responde para cada biblioteca individual como si la otra no existiera.
  2. Para dibujar o no para dibujar . Otra gran pregunta, pero se trata solo del tema de dibujar CoreGraphics vs entrega del problema a UIKit, pero de todos modos, la respuesta elegida ofrece partes del rompecabezas.
  3. Animar rodajas de pastel con CALayer personalizado . Debe ser uno de los tutoriales más valiosos que he visto en este tema, es el único que me ha guiado para dibujar un CALayer
  4. Lo que es diferente entre CoreGraphics y CoreAnimation Absolutamente decepcionado por lo rápido que el asker aceptó la respuesta, siento que hay mucho más por hacer aquí.
  5. Varios videos WWDC, pero no he visto uno que explique en detalle el alcance general. Si alguien responde con un video de WWDC, lo consideraré una respuesta válida.