2010-07-14 4 views
14

Ich habe ein UITableView mit kundenspezifischen Zellen, die in der xib-Datei definiert wurden, und erlebe eine schlechte Leistung Scrollen (abgehackt) auf dem Gerät, wenn die Zellen auf ihnen eine UISegmentedControl haben. NSLog-Anweisungen zeigen, dass die Zellen so zugewiesen und wiederverwendet werden, wie sie sollten. Mein Code für die cellForRowAtIndexPath-Methode ist unten. Verbindungen werden in der Xib gemäß Apple-Dokumentation hergestellt. (Scrolls glatt btw in Simulator)Warum ist die Bildlaufleistung für benutzerdefinierte Tabellenansichtszellen mit UISegmentedControl-Objekten schlecht?

- (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; 
} 

Antwort

46

Jede Zeichnung, die eine Tabellenzelle zu tun hat, während es durchgeblättert wird Performance-Probleme verursachen; Wenn Sie viele Untersichten haben, wird sehr viel gezeichnet, und das wird - wie Sie bemerkt haben - ziemlich unruhig. Es gibt mehrere Möglichkeiten, dies zu reduzieren.

Der erste Schritt besteht darin, sicherzustellen, dass die Zellen opaque für ihre Zellen selbst und für so viele Unteransichten wie möglich auf YES festgelegt sind. Undurchsichtige Ansichten müssen nicht mit dem Inhalt unter ihnen verschmolzen werden, und das spart viel Zeit.

Sie können auch Schichten Ihre Zellen festlegen möchten, sich rastern, wie folgt aus:

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

Diese Ihre Ansicht Hierarchie in eine flache Bitmap zusammenbrechen wird, die die Art der Sache ist nur Core Animation liebt zeichnen. Beachten Sie, dass z. B. bei allen animierenden Ansichten - Aktivitätsindikatoren - diese Bitmap bei jeder Änderung, d. H. Sehr häufig, aktualisiert wird. In diesem Fall möchten Sie nicht, dass die Zelle alles rastert. Sie könnten einfach eine Unteransicht mit all Ihren relativ statischen Ansichten (z. B. Beschriftungen) unter einer anderen Unteransicht mit einem solchen dynamischen Inhalt verwenden und nur die erste davon gerastert haben.

+0

Noah, nachdem die erste Zeile Code hinzufügen Sie vorgeschlagen, und dann auch das Hinzufügen des Quartz Rahmen, so kann ich auf die Schicht beziehen, ich Fehler bekommen bauen: „Antrag auf Mitglieder shouldRasterize 'in etwas keine Struktur oder Union“ . Würden Sie bitte mehr darüber sagen, was erforderlich ist, damit diese beiden Codezeilen funktionieren? – Alyoshak

+3

Dieser Fehler tritt möglicherweise auf, wenn Sie #import in Ihrem .m; Außerdem sollte sOnRasterize nur in iOS 3.2 und höher verfügbar sein. –

+0

Ja ist in meiner .m-Datei importiert und auch. Aber, nein, nicht mit 3.2 (mit 3.1.3). Muss das Problem sein. Ja, und ich kann nicht einmal erfolgreich mit iOS 3.2 auf dieses Gerät (iPod Touch) erstellen. Code-Signing-Fehler und ein weiterer seltsamer Fehler bezüglich iOS 3.2. Beide sind hier: [beror] Codesign Fehler: Code-Signatur ist für die Produktart ‚Anwendung‘ in SDK erforderlich ‚Geräte - iPhone OS 3.2‘ [BWARN] Warnung: Gebäude mit ‚Gezielter Gerätefamilie‘ auf iPhone nur ('1 ') nicht unterstützt mit SDK' Gerät - iPhone OS 3.2 '. – Alyoshak

3

stellen Sie sicher, Ihre Kennung ‚MyIdentifier‘ im xib. Wenn nicht, erzielen Sie eine gute Leistung. Ich vermute, dass "zugewiesen und wiederverwendet, wie sie sollten" bedeutet, dass einige beim Start zugewiesen und nicht mehr nach zugeordnet werden. Wenn das stimmt, dann sind Sie wahrscheinlich alle eingestellt.

Eine weitere Möglichkeit zur Verbesserung der Leistung ist die Tabellenansicht mit Code zu konstruieren. Es ist ein gutes Stück schneller als mit Xibs. Wenn ich Tabellenansichten konstruiere, baue ich sie normalerweise in IB, kopiere dann die Rahmenwerte in Code und konstruiere Code.

einige Zeit beiseite legen die WWDC 2010 Performance Videos zu sehen. Viele tolle Informationen, ich lerne jedes Mal etwas Neues, wenn ich sie sehe.

Verwandte Themen