2010-07-14 11 views
14

Ho un UITableView con celle personalizzate che sono state definite nel file xib e sto sperimentando scarse prestazioni di scorrimento (discontinue) sul mio dispositivo quando le celle hanno un UISegmentedControl su di esse. Le dichiarazioni di NSLog rivelano che le cellule vengono assegnate e riutilizzate come dovrebbero. Il mio codice per il metodo cellForRowAtIndexPath è sotto. Le connessioni sono fatte nello xib come da documentazione di Apple. (Scorre senza intoppi nel simulatore btw)Perché le prestazioni di scorrimento sono scadenti per le celle di visualizzazione tabella personalizzate con oggetti UISegmentedControl?

- (UITableViewCell *)tableView:(UITableView *)tableView 
       cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *MyIdentifier = @"MyIdentifier"; 

    UITableViewCell *cell = 
      [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    if (cell == nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" 
           owner:self 
           options:nil]; 
     cell = self.tvCell; 
     self.tvCell = nil; 
    } 

    cell.layer.shouldRasterize = YES;  // build error is here 

    UILabel *lbl = (UILabel *)[cell viewWithTag:1]; 

    [lbl setText:[NSString stringWithFormat:@"Q%i", indexPath.row+1]]; 

    return cell; 
} 

risposta

46

qualsiasi disegno che una cella di tabella ha a che fare mentre viene fatto scorrere sta per causare problemi di prestazioni; quando hai molte sottoview, tende ad esserci un sacco di disegni in corso, e questo, come hai osservato, renderà il tuo scorrimento piuttosto discontinuo. Ci sono un paio di modi per provare a ridurlo.

Il primo passaggio consiste nell'assicurarsi che le proprie celle e il maggior numero possibile di loro visualizzazioni secondarie abbiano le loro proprietà opaque impostate su YES. Le viste opache non devono essere mescolate con il contenuto sottostante e ciò consente di risparmiare un sacco di tempo.

Si consiglia inoltre di impostare i livelli vostre cellule per rasterizzare stessi, in questo modo:

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

Questo comprimere la gerarchia della vista in una bitmap piatta, che è il genere di cose Core Animation ama solo a disegnare. Si noti che qualsiasi indicatore di attività di visualizzazione animate, ad esempio, imporrà l'aggiornamento di tale bitmap ogni volta che cambiano, ovvero molto. In tal caso, non vorrai che la cella rasterizzi tutto; potresti semplicemente utilizzare una sottoview con tutte le tue viste relativamente statiche (ad esempio le etichette) sotto un'altra sottoview con qualsiasi contenuto dinamico di questo tipo e avere solo il primo di quelli rasterizzati.

+0

Noah, dopo aver aggiunto la prima riga di codice che hai suggerito, e quindi anche aggiungendo il framework QuartzCore in modo che possa fare riferimento al livello, ottengo errore di compilazione: "richiesta per membro" dovrebbeRasterizzare "in qualcosa non una struttura o unione" . Vorresti dire di più su cosa è necessario per far funzionare queste due linee di codice? – Alyoshak

+3

Questo errore potrebbe verificarsi se non hai #import nel tuo .m; inoltre, shouldRasterize è disponibile solo in iOS 3.2 e versioni successive. –

+0

Sì viene importato anche nel mio file .m e anche in . Ma, no, non usare 3.2 (usando 3.1.3). Deve essere il problema Sì, e non riesco nemmeno a costruire con successo il targeting di questo dispositivo (iPodTouch) con iOS 3.2. Errore di firma del codice e un altro strano per iOS 3.2. Entrambi sono qui: [BEROR] Errore CodeSign: la firma del codice è richiesta per il tipo di prodotto 'Applicazione' nell'SDK 'Dispositivo - iPhone OS 3.2' Avviso [BWARN]: creazione con 'Famiglia dispositivo mirata' impostata solo su iPhone ('1 ') non supportato con SDK' Device - iPhone OS 3.2 '. – Alyoshak

3

Verificare che l'identificatore sia "MyIdentifier" nello xib. Se non lo è, otterrai un buon risultato in termini di prestazioni. Immagino che "assegnati e riutilizzati come dovrebbero" significano alcuni allocati all'avvio e non più assegnati dopo. Se è vero, probabilmente sei tutto pronto.

Un altro modo per migliorare le prestazioni è costruire la vista tabella con il codice. È molto più veloce rispetto all'utilizzo di Xib. Quando costruisco le viste tabella di solito li costruisco in IB, quindi copio i valori del frame in codice e costruisco nel codice.

Lasciare un po 'di tempo per guardare i video delle prestazioni del WWDC 2010. Un sacco di grandi informazioni, imparo qualcosa di nuovo ogni volta che li guardo.

Problemi correlati