2012-03-29 9 views
6

Ho un UITableView che ha tre UIImageView visualizzazioni per cella, con tre celle visualizzate contemporaneamente nella vista (per un totale di nove visualizzazioni UIImageView). Pensalo come una libreria. A volte posso avere fino a 500 libri.Aggiunta un'ombra a UIImageView su un UITableView uccide le prestazioni ... perché?

Ho aggiunto ombra al UIImageView con il codice che è questo:

UIImageView *itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(25, 7, 65, 75)]; 
itemImageView.contentMode = UIViewContentModeScaleAspectFit; 
itemImageView.tag = 6; 
itemImageView.layer.shadowColor = [UIColor blackColor].CGColor; 
itemImageView.layer.shadowOffset = CGSizeMake(3, -1); 
itemImageView.layer.shadowOpacity = 0.7; 
itemImageView.layer.shadowRadius = 3.0; 
itemImageView.clipsToBounds = NO; 
[cell.contentView addSubview:itemImageView]; 

Quando aggiungo il codice ombra, come visto sopra, le prestazioni di scorrimento è solo totalmente ucciso e diventa instabile. Ogni immagine ha un diverso Rect quindi l'ombra deve essere creata per ogni oggetto mentre scorre. Qualcuno ha qualche consiglio su come aggiungere ombre alle mie immagini su un UITableView senza avere questo problema?

+0

Ho risposto a una domanda simile qui: http://stackoverflow.com/a/10133182/242769 – aryaxt

risposta

0

Attivate il riutilizzo? In caso contrario, le celle verranno rifatte ogni volta che la vista cambia (ad es. Durante lo scorrimento). Ciò mangerebbe sicuramente un sacco di prestazioni.

+0

Sì, ho riutilizzato –

9

si può vedere un miglioramento delle prestazioni se si aggiunge

itemImageView.layer.shadowPath = 
     [UIBezierPath bezierPathWithRect:itemImageView.layer.bounds].CGPath; 

Ma, in generale, le operazioni di livello come questo ucciderà prestazioni in una vista tabella. Ho sperimentato esattamente lo stesso problema, e abbiamo appena eliminato l'effetto ombra. Non ne valeva la pena.

+0

Funziona ma l'ombra è assegnata a tutti e 4 i lati di una vista .. – NSPratik

1

Le ombre sono costose e uccideranno le tue prestazioni.

Un approccio migliore consiste nel rendere l'immagine ombreggiata in background, salvarla/salvarla e visualizzarla nella vista quando è pronta.

Modifica: Si preferisce esaminare le routine Core Graphics/CGImage. In particolare, CGContextSetShadowWithColor ti disegna un'ombra.

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html

+0

Tu dici la tua vista sembra una libreria - almeno per me, questo implica che tutto con un'ombra è rettangolare (e probabilmente della stessa dimensione). Riutilizzare la stessa immagine ombra suona sicuramente come la strada da percorrere in quel caso. (E se i tuoi rettangoli non sono tutti della stessa dimensione, puoi comunque riutilizzare l'immagine con il supporto per le immagini ridimensionabili di UIImage.) – rickster

+0

Non deve necessariamente essere rettangolare. È possibile eseguire il rendering di un'immagine ombreggiata su un primo piano arbitrario e quindi renderizzare l'ontop di uno sfondo arbitrario. Quello che suggerisco è il caching dell'immagine sandwich (primo piano, ombra, sfondo) – lorean

+0

Grazie rickster ... tutte le mie immagini sono rettangolari. Darò a questo un colpo e ridimensionarlo appena necessario e vedere come appare. –

3

Si dovrebbe rivedere i video WWDC Core Animation migliori pratiche. È possibile richiedere che la copia rasterizzata dell'ombra venga memorizzata nella cache. Il cacao è abbastanza veloce da rendere queste ombre al volo senza ricadere su un'immagine pre-renderizzata.

Esempio:

itemImageView.layer.shouldRasterize = YES; 

Anche io up-votato la risposta per quanto riguarda UIBezierPath. Questo è anche menzionato nelle migliori pratiche, ma l'impostazione del percorso shadow di un CALayer è un enorme incremento delle prestazioni. Puoi anche creare alcuni effetti speciali interessanti manipolando il percorso dell'ombra.

+1

L'aggiunta di shouldRasterize = YES ha definitivamente ucciso la qualità dell'immagine. Qualche idea, perché? –

+0

Sta riutilizzando un'immagine rasterizzata per tutti i livelli nella gerarchia. Hai anche impostato il percorso dell'ombra per migliorare la qualità dell'immagine? – Sam

+3

Se la qualità del livello è degradata è probabile che b/c sia necessario aggiungere il codice: self.rasterizationScale = [[UIScreen mainScreen] scala] – capikaw

0

Guarda il mio stessa domanda qui: App running slowly because of UIImageViews

Vorrei usare questo codice:

imageView.layer.masksToBounds = NO; 
UIBezierPath *path = [UIBezierPath imageView.bounds]; 
imageView.layer.shadowPath = path.CGPath; 
0

Ho lo stesso problema con l'aggiunta di ombra alle etichette all'interno di un tableviewcell. Ho provato al layout elementi all'interno cellForRowAtIndexPath quando verrà creata la cella:

if(cell == nil){ 
    //layout cell 

Questi ottimizzato lo scorrimento un po ', ma è piuttosto instabile.

per ottimizzare le tue foto di qualità si dovrebbe aggiungere anche la rasterizationScale di aver attivato "shouldRasterize":

aLabel.layer.shouldRasterize = YES; 
aLabel.layer.rasterizationScale = [[UIScreen mainScreen] scale]; 

Forse qualcuno ha alcune idee su come ottimizzare il codice per ottenere i normali iOS scorrimento. thx

Problemi correlati