2011-11-30 2 views
5

Ho il seguente codice per aggiungere un colore di bordo e ombreggiatura allo sfondo del mio UITableViewCell. Il mio problema è che questo codice causa un enorme ritardo sul TableView stesso.UITableView Lagging a causa di ombre e bordi

Per favore, puoi dirmi come posso ottimizzare il mio codice, evitando il ritardo di UITableView?

if ([cell viewWithTag:012] == nil && comment.isReply == NO) { 
    UIImageView *iv = [[[UIImageView alloc] initWithFrame:frame] autorelease]; 
    [iv setImage:[UIImage imageNamed:@"paper"]]; 
    [iv setTag:012]; 
    [cell insertSubview:iv atIndex:0]; 

    [iv.layer setBorderWidth:1.0]; 
    [iv.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 

    [iv.layer setShadowColor:[[UIColor blackColor] CGColor]]; 
    [iv.layer setShadowOffset:CGSizeMake(0, 1)]; 
    [iv.layer setShadowOpacity:0.75]; 

} 

else if ([cell viewWithTag:012] == nil && comment.isReply == YES) { 

    frame.origin.x += 35; 

    UIImageView *iv = [[[UIImageView alloc] initWithFrame:frame] autorelease]; 
    [iv setImage:[UIImage imageNamed:@"paper"]]; 
    [iv setTag:012]; 
    [cell insertSubview:iv atIndex:0]; 

    UIImage *arrow = [UIImage imageNamed:@"arrow"]; 
    UIImageView *ivs = [[[UIImageView alloc] initWithFrame:CGRectMake(-12, ([cell frame].size.width/2) + ([arrow size].width/2) , arrow.size.width, arrow.size.height)] autorelease]; 
    [cell addSubview:ivs]; 

    [iv.layer setBorderWidth:1.0]; 
    [iv.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 

    [iv.layer setShadowColor:[[UIColor blackColor] CGColor]]; 
    [iv.layer setShadowOffset:CGSizeMake(0, 0)]; 
    [iv.layer setShadowOpacity:0.75]; 

} 
+0

Dove esattamente si aggiungono le ombre? Voglio dire, lo fai nell'origine dati UITableView? Se è così, dovresti davvero creare una sottoclasse UITableViewCell personalizzata e fare l'interfaccia utente personalizzata lì. –

+0

Mi spiace, non l'ho chiarito, questo è nel metodo cellForRowAtIndexPath. –

risposta

1

si dovrebbe evitare di manipolare il cellulare su ogni carico, invece è necessario regolare l'interfaccia utente quando la cellula viene inizializzato/creato.

Per illustrare, ogni volta che si scorre una nuova cella (o più) può essere caricata utilizzando il metodo cellForRowAtIndexPath:, attualmente si stanno facendo molte modifiche di visualizzazione in questo metodo, ma potrebbero esserci casi in cui ciò non è necessario (per esempio la nuova cella è dello stesso tipo di quella appena sfogliata fuori dallo schermo). Sposta questa modifica dell'interfaccia utente al punto in cui la cella viene inizializzata e non dove vengono scambiati i dati. Puoi farlo con una sottoclasse o semplicemente così.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Reuse id 
    static NSString *identifier1 = @"identifer-1"; 
    static NSString *identifier2 = @"identifier-2"; 
    static NSString *regular = @"regular"; 

    UITableViewCell *cell; 

    if (comment.isReply == NO) { 
     cell = [tableView dequeueReusableCellWithIdentifier: identifier1]; 

     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: identifier1] autorelease]; 

      // Do the UI modification here 
     } 
    } else if (comment.isReply == YES) { 
     cell = [tableView dequeueReusableCellWithIdentifier: identifier2]; 

     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: identifier2] autorelease]; 

      // Do the UI modification here 
     } 
    } else { 
     // Regular cell 
     cell = [tableView dequeueReusableCellWithIdentifier: regular]; 

     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: regular] autorelease]; 
     } 
    } 

    // Load the data into the cell 

    return cell; 
} 

auguro che si ottiene dove sto andando con questo, la chiave è di fare roba pesante il meno possibile e lasciare che il caching UITableView hanno un effetto maggiore.

20

Oltre agli altri consigli di ottimizzazione qui, la specifica di shadowPath su CALayer migliorerà le prestazioni del disegno in ombra. Si potrebbe stabilire un percorso per l'ombra con qualcosa di simile ...

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

Si consiglia inoltre di esaminare la shouldRasterize bit su CALayer. Ciò fa sì che il layer sia pre-renderizzato come bitmap. Assicurati di fornire anche un rasterizationScale che corrisponde al tuo dispositivo se segui questo percorso.

cell.layer.shouldRasterize = YES; 
cell.layer.rasterizationScale = [UIScreen mainScreen].scale; 
+1

Dai un'occhiata a questo [post del blog] (http://nachbaur.com/blog/fun-shadow-effects-using-custom-calayer-shadowpaths) con alcuni shadowPath diversi che puoi utilizzare –

+1

grazie mille per questo consiglio sulla rasterizzazione ! ha fatto il trucco per me;) ora il mio tavoloView scorrere così agevolmente ^^ – polo987

+0

OMG, GRAZIE! Scusa, posso solo votare una volta. –