2009-07-30 17 views
13

Mi objeto una subclase de NSObject tiene variable de instancia CALayer. Lo uso para dibujar y almacenar en caché el contenido con su delegado establecido en mi objeto.Método de delegado CALayer drawLayer no se llama

Pero por alguna razón drawLayer:inContext: se llama al método NUNCA. Mientras que el método delegado actionForLayer:forKey: se llama, lo que implica que el delegado se establece correctamente con layer.delegate = self en el método init del objeto.

¿Alguna sugerencia sobre qué impide que se llame mi método de dibujo en capas drawLayer:inContext:?

Me llaman [layer setNeedDisplay] a menudo. Así que supongo que es un error fundamental.

Respuesta

22

drawLayer:inContext: no se llamará si su marco es CGRectZero o fuera de la pantalla. Además, si su CALayer no está conectado a una capa existente en pantalla, nunca dibujará, no importa cuántas veces llame al setNeedsDisplay

+1

setNeedsDisplay – antonio081014

+1

error tipográfico fijo ... gracias. – amattn

4

Si finalmente usa el CALayer con un UIView, entonces el delegado debe ser la vista objeto en sí mismo:

de la documentación iOS CALayer:

"En iOS, si la capa está asociada con un objeto UIView, esta propiedad se debe establecer en la opinión de que es propietaria de la capa."

+0

guau, me lo perdí, gracias. – huggie

+3

Presumiblemente, "asociado con un objeto UIView" significa que la capa es la capa raíz de la vista (a la que se hace referencia mediante la propiedad 'layer'). Para las subcapas de la capa raíz de UIView, el delegado definitivamente puede ser algo más que el objeto de vista. – herzbube

17

implementar un vacío drawRect:

- (void)drawRect:(CGRect)rect { 
} 

Tomado del proyecto ZoomingPDFViewer: -

UIView utiliza la existencia de -drawRect: para determinar si debe permitir su CALayer a ser invalidado, el cual conduciría a la capa creando una tienda de respaldo y -drawLayer:inContext: siendo llamado. Mediante la implementación de un método vacío -drawRect:, permitimos UIKit a seguir aplicando esta lógica, mientras hacemos nuestro trabajo real de dibujo interior de -drawLayer:inContext:

+0

Esto también es cierto en macOS. –

+0

Apple dice que no implementa un método drawRect vacío en UIView ya que afecta el rendimiento. Llamar - [setNeedsDisplay] parece ser una mejor solución. (Trabajó para mi.) – JCalhoun

7

debe ser llamado de setNeedsDisplay El objeto de capa. Simplemente agregar la capa como una subcapa no hace eso por usted. Obtuve esto de Ray Wenderlich's CALayer tutorial.

1

Si usted tiene una aplicación multi-hilo en el proceso de fondo impulsa la necesidad de actualizar la CALayer, debe llamar setNeedsDisplay en el hilo principal

Cuestiones relacionadas