2012-06-18 20 views
9

Tengo una vista con un respaldo CATiledLayer. Quiero tomar las teselas visibles de esta UIView CATiledLayer y agregarla a otra vista como respaldo de CALayer, recreando así la imagen visible en otra UIView que no utiliza CATiledLayer.CATiledLayer a CALayer

La razón por la que quiero hacer esto es usar esta segunda UIView para enmascarar el efecto de actualizar la UIView respaldada por CATiledLayer - esto produce actualmente un parpadeo cuando todas las teselas se vuelven a cargar.

El problema es que no estoy totalmente seguro de cómo podría hacer esto. ¿Algunas ideas?

+1

Así que usted quiere tener una visión deliberadamente baldosas y hacer una vista normal para ocultar la vista de azulejos ...? Tal vez una pregunta loca, pero ¿por qué fue tan original? –

+0

@PauldeLange - Cuando mi vista en mosaico se recarga, "parpadea" cuando las fichas se vuelven a dibujar. Habrá una UIView debajo de la vista en mosaico que será una copia directa de las fichas de arriba. Luego, cuando se vuelven a cargar las fichas, la vista inferior se mostrará durante una fracción de segundo a medida que las fichas se vuelven a cargar, deteniendo así el efecto de parpadeo. Por lo que puedo decir, esta es una práctica bastante común para los programas de gráficos: usar un buffer gráfico para suavizar los efectos de renderizar cualquier contenido nuevo anterior. –

+0

Si puede renderizar la vista de fondo más rápido que las fichas, ¿por qué tiene mosaicos? afecto -> efecto por cierto. –

Respuesta

3

CATiledLayer es una subclase de CALayer proporcionando una manera de de forma asíncrona proporcionar baldosas del contenido de la capa, potencialmente en caché en múltiples niveles de detalle.

Puede hacer que las cosas visibles en la capa en una CGContextRef con:

- (void)renderInContext:(CGContextRef)ctx 

Y luego usar esto para actualizar su otra capa mediante la configuración de su delegado y la aplicación de la

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

ss se muestra aquí http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Pero, sinceramente, no creo que esto sea eficiente.

+0

Gracias por la respuesta. Usted dice que no es eficiente. ¿Tiene alguna otra idea que pueda ayudar a resolver mi problema de parpadeo? –

+0

@Luis 'renderInContext' no parece funcionar en' CATiledLayer' como 'CALayer' hace por mí. Las fichas no se representan en absoluto. ¿Algunas ideas? – Tim

0

Su problema real aquí es el parpadeo. He tenido un problema similar en una vista con una CALayer encargo respaldándolo, esto era parte de la solución: crear una subclase personalizada de su CALayer y aplicar el siguiente método:

- (void) display { 
    self.contents = nil; 
    [super display]; 
} 

Esto fija un conjunto de problemas de yo, pero no puedo arreglarlo para ti. La alternativa para usted puede ser desactivar transacciones mientras actualiza: De CATransaction Class Reference

setDisableActions: establece si las acciones desencadenan como consecuencia de los cambios de propiedad realizadas dentro de este grupo de transacciones son suprimidos.

Así que para utilizar este:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// do updating/flickering stuff 
[self doFlickeringThing]; 
[CATransaction commit];