2012-06-18 5 views
9

Ho una vista con un supporto CATiledLayer. Voglio prendere le tessere visibili da questo UIView CATiledLayer e aggiungerlo a un'altra vista come suo supporto CALayer, ricreando così l'immagine visibile in un altro UIView che non usa CATiledLayer.CATiledLayer to CALayer

Il motivo per cui voglio farlo è che userò questo secondo UIView per mascherare l'effetto dell'aggiornamento di UIView con backup CATiledLayer - questo attualmente produce uno sfarfallio poiché tutte le tessere vengono ricaricate.

Il problema è che non sono completamente sicuro di come lo farei. Qualche idea?

+1

Così si vuole avere una visione volutamente in maiolica e fare una vista normale per nascondere la vista piastrellato ...? Forse una domanda pazzesca, ma perché è stata piastrellata per cominciare? –

+0

@PauldeLange - Quando la mia vista piastrellata viene ricaricata, "sfarfallio" quando le piastrelle vengono ridisegnate. Ci sarà un UIView sotto la vista piastrellata che sarà una copia diretta delle tessere sopra. Quindi, quando le tessere vengono ricaricate, la vista dal basso verrà visualizzata per una frazione di secondo mentre le tessere vengono ricaricate, interrompendo quindi l'effetto del flicker. Da quello che posso dire è una pratica abbastanza comune per i programmi di grafica - utilizzando un buffer grafico per appianare gli effetti del rendering di qualsiasi nuovo contenuto sopra. –

+0

Se è possibile rendere la vista di sfondo più veloce delle tessere, perché hai le tessere? effetto -> effetto a proposito. –

risposta

3

CATiledLayer è una sottoclasse di CALayer fornire un modo per fornire asincrono piastrelle del contenuto del livello, potenzialmente cache a più livelli di dettaglio.

È possibile rendere le cose visibili nello strato in un CGContextRef con:

- (void)renderInContext:(CGContextRef)ctx 

E quindi utilizzare questo per aggiornare il vostro altro strato per impostazioni suo delegato e l'attuazione della

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

ss mostrato qui http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Ma sinceramente non penso che sia efficiente.

+0

Grazie per la risposta. Dici che non è efficiente. Avete altre idee che possono aiutare a risolvere il mio problema di sfarfallio? –

+0

@Luis 'renderInContext' non sembra funzionare su' CATiledLayer' come fa per me il 'CALayer'. Le tessere non vengono affatto visualizzate. Qualche idea? – Tim

0

Il tuo vero problema qui è lo sfarfallio. Ho avuto un problema simile su una vista con un CALayer personalizzato sostenerla, questa è stata parte della soluzione: creare una sottoclasse personalizzata della vostra CALayer e attuare il seguente metodo:

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

Questo risolto una serie di problemi per la io, ma non posso aggiustarlo per te. L'alternativa per voi può essere quella di disabilitare le transazioni mentre si aggiorna: Da CATransaction Class Reference

setDisableActions: Imposta se le azioni attivate a seguito di modifiche alle proprietà effettuate all'interno di questo gruppo di transazione vengono soppressi.

Quindi, per usare questo:

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