8

En primer lugar, encuentro que los documentos en línea de iPhone no son tan claros en lo que respecta a las diversas formas de renderizar una capa. Entiendo lo que quiero decir, pero no estoy claro cuándo usar qué métodos y cuál requiere que la capa se agregue como sub capa o no.Problemas de dibujo con CALayer

Mi proyecto comenzó trivialmente cargando imágenes y simplemente dibujándolas en una UIView a través de [image drawAtPoint:] así como [image drawInRect:]. Funcionan bien utilizando el contexto gráfico actual.

Entonces, hoy he leído este concepto de usar capas, por lo que animar mis varias imágenes (implícitamente) en teoría sería muy fácil.

Para el registro, sé que los documentos dicen que la subclase de CALayer es innecesaria, pero lo hice. Ahora estoy increíblemente confundido acerca de las diferentes maneras de supuestamente renderizar una capa.

  • drawLayer
  • displayLayer
  • pantalla
  • drawInContext

Ahora, para todos estos métodos, es necesario ajustar el tamaño de fotograma de la capa? ¿Es necesario agregar una capa a la capa de una vista?

El único método que me da resultados visibles es el método drawinContext. Pero si aplico una animación implícita (por ejemplo, image.opacity = 0) no ocurre nada, lo que me hace creer que mi capa no está configurada correctamente.

Alguien por favor traiga el orden a este caos.

Respuesta

18

Core Animation hace este tipo de cosas triviales. La sugerencia de Brad es correcta. La conclusión es que no necesita ninguno de esos métodos para simplemente renderizar la capa. Con el fin de hacer que la capa de render, asegúrese de que ha hecho lo siguiente:

  • establecer la propiedad contenidos con:

    [imageLayer setContents:(id)[[UIImage [email protected]"image.png"] CGImage]];

  • Establecer los límites de la capa con el tamaño usted quiere.

    [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];

  • establecer la posición (x, y ubicación) de la capa para mostrar en la vista. El punto de ancla predeterminado es el centro de la capa. Este código centra la capa en su vista.

    [imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];

  • Añadir la capa a capa de la vista:

    [[[self view] layer] addSublayer:imageLayer];

Por cierto, si lo prefiere, puede configurar ambos límites y posición en un método llamando -setFrame :. Prefiero usar las dos llamadas porque me parece más legible, pero eso depende de tu preferencia. Sin embargo, si no establece los límites y la posición o el marco de la capa, la capa no se procesará.

Si prefiere, puede evitar el uso de drawInContext mediante la creación de capas adicionales que dibujan caminos, formas (véase CAShaperLayer), o imágenes adicionales y añadirlos como subcapas de la capa de imagen o agregarlos como subcapas de la capa de matriz y dales una posición z que los haga aparecer delante de tu capa de imagen.

Ahora, si desea animar la opacidad, puede utilizar la animación implícita simplemente configurando la propiedad de capa de la manera exacta que describió, p. Ej. [imageLayer setOpacity: 0.0f]; Esto desvanecerá la capa y todas sus capas secundarias durante más de 0,25 segundos.

Solo algunas ideas adicionales.

Atentamente.

2

Si todo lo que quiere que hagan sus diversas capas es mostrar una imagen cada una, no debería necesitar subclasificarlas en absoluto. Debería poder establecer una imagen (en formato CGImageRef) en la propiedad contents de cada capa. La capa manejará el dibujo de esa imagen. Puede obtener la representación de imagen gráfica básica de un UIImage utilizando su propiedad de solo lectura CGImage.

Sin embargo, tiene razón acerca de que -drawInContext: es el lugar correcto para poner más código de dibujo personalizado dentro de una subclase CALayer. Sin subclasificar CALayer, puede hacer que un delegado cambie el comportamiento de dibujo de la capa a través del método de delegado -drawLayer:inContext:.

Todo esto se describe en detalle en la sección "Providing Layer Content" de Core Animation Programming Guide de Apple.

+0

Lo que terminé haciendo es crear subclases (porque mis objetos son complicados) y configuré el delegado por sí mismo. Así que básicamente estoy usando displayLayer. Todo lo que necesito hacer es llamar al setNeedsDisplay de la capa. Así que ahora la pregunta aún permanece sobre el uso de drawInContext y drawLayer: inContext. ¿Se llaman de forma manual o se llaman internamente a través de SetNeedsDisplay? Solo curiosidad ahora. – AlvinfromDiaspar

+0

Aquí hay una pregunta de seguimiento más pertinente: Ahora puedo renderizar en una capa usando la capa drawLayer: (CALayer *). Sin embargo, si deseo actualizar la representación, digamos un marco de animación, en la capa, si configuro el contenido de la capa con una imagen * actualizada, el contenido desaparece en la pantalla. ¿Debo quitar la capa y luego renderizarla y luego volver a agregarla al árbol de renderizado? Si este es el caso, ¡esto sopla! – AlvinfromDiaspar

+0

A su primera pregunta: drawInContext: nunca se debe invocar directamente, sino que indirectamente se activa mediante setNeedsDisplay. Si no ha anulado el método, creo que llama al delegado para ayudarlo a mostrar el contenido mediante -drawLayer: inContext: –

Cuestiones relacionadas