Estoy subclasando CALayer para proporcionar mi propio método de dibujo. Para la optimización llamo al -[MyLayer setNeedsDisplayInRect:]
en lugar de -[MyLayer setNeedsDisplay]
. En el método de dibujo obtengo el rect que se debe volver a dibujar a través del CGContextGetClipBoundingBox()
.- [CALayer setNeedsDisplayInRect:] hace que toda la capa se vuelva a dibujar
Si utilizo esta capa como base capa de un UIView todo funciona como se esperaba. El problema surge, tan pronto como utilizo mi capa personalizada como una subcapa de otro CALayer. Than CGContextGetClipBoundingBox()
siempre devuelve el rect de los límites de esa capa.
¿Alguna idea?
[EDIT]
Parece que no hay ninguna garantía de que el contenido de la CALayer se almacena en caché y sólo la parte sucia se vuelve a dibujar. Hice una pequeña prueba y almacené el rect que necesita mostrar como una propiedad separada. El resultado fue que solo esta parte era visible en la pantalla.
Ahora voy a renderizar en un contexto de imagen y mantener esa imagen como un caché. En el método de dibujar, solo mostraré la imagen en caché.
¿Las capas que no se ven tienen su propiedad 'masksToBounds' establecida en' YES'? Si no, hay una buena razón por la cual no se cortarán. – MrMage
Desafortunadamente esto no lo resuelve. El problema es que 'CGContextGetClipBoundingBox()' devuelve los límites de la capa y no de la región que debe actualizarse según lo documentado por Apple: * Las subclases que desean encontrar la región real para dibujar pueden llamar a CGContextGetClipBoundingBox. * [DrawInCOntext:] (https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/drawInContext :) –
¿Alguna vez ha llegado al abajo de esto? Tengo el mismo problema molesto. – mprivat