2009-08-20 10 views
7

Ich habe eine Anzahl Zeilen, die ich mit -insertRowsAtIndexPaths: withRowAnimation in eine Tabelle einfüge, und möchte, dass die Zeilen von links eingerückt werden, um sie vom Rest der Zellen zu unterscheiden. Die Eigenschaft indentationLevel von UITableViewCell sieht aus, als ob es genau das ist, was ich brauche, aber es scheint nichts zu tun. Hier ist der Code, den ich mit der Vertiefung Pegel (Punktsyntax keinen Unterschied macht):indentationLevel-Eigenschaft scheint nichts zu tun?

[cell setIndentationWidth:10]; 
[cell setIndentationLevel:1]; 

Ist indentationLevel, was ich will, oder sollte ich woanders suchen?

Antwort

0

Alles, was ich gelesen habe, schlägt vor, dass es so ist, wie Sie es tun sollen. Stellen Sie sicher, dass Sie später im Code keine neue Zelle mit demselben Zeiger erstellen (nachdem Sie den Einzug festgelegt haben, aber bevor er gezeichnet wird). Haben Sie versucht, die Einrückung auf etwas Größeres zu setzen, das auf dem Bildschirm deutlicher ist (sagen wir 100px anstelle von 10)?

+0

Wenn Sie Zeiger sagen, beziehen Sie sich nicht auf die Kennung, oder? Meine Zellen sind alle Objekte derselben Klasse, also stelle ich mir vor, sie wären alle Zeiger auf dasselbe Objekt. Meine Zellenkennung basiert jedoch auf dem vollständigen indexPath und ist daher für jede Zelle eindeutig. Trotzdem keine Freude beim Einrücken. – JoBu1324

+0

Ich habe bestätigt, dass die Einzugsebene und -breite in der Zelle festgelegt werden, bevor die Zelle zur Anzeige an das Betriebssystem zurückgegeben wird. Was könnte schief gehen? – JoBu1324

1

Sie können seine Implementierung in Ihren Zellen überstürzen. in

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     if (cell == nil) 
     { 
      cell = (UITableViewCell*)[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cellType01"] autorelease]; 
      [cell setIndentationLevel:indexPath.row]; 
      [cell setIndentationWidth:10]; 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
      // Tag the view 
      [[[cell subviews] objectAtIndex:0] setTag:111]; 
      UILabel* labelView = [[UILabel alloc] initWithFrame: CGRectMake(cell.indentationLevel*cell.indentationWidth, 0, 300, 20)]; 
     } 
    } 
14

indentationLevel und indentationWidth wirken sich auf die Positionierung der Standardelemente textlabel, detailTextLabel und Imageview. Sie haben keinen Einfluss auf den Ursprung des Frames von contentView.

Wenn Sie nicht TextLabel usw. verwenden (vielleicht weil Sie auf das iPhone OS 2 ausgerichtet sind), müssen Sie den Einzug manuell behandeln, wie die vorherige Antwort zeigt.

1

Ich stieß auf ein ähnliches Problem mit meiner App. Ich hatte eine UITableView, die benutzerdefinierte Zellen NICHT verwendet. Ich benutzte eine UITableViewCell mit einem Basic-Stil. In meiner Delegiertenmethode - (UITableViewCell *)tableView: cellForRowAtIndexPath: setze ich die Zellen indentationWidth und indentationLevel. Sie haben nichts getan. Ich habe sogar versucht, die Delegiertenmethode - (NSInteger)tableView: indentationLevelForRowAtIndexPath: zu ändern. Nichts.

Was schließlich funktionierte, ging zum Storyboard und änderte die Attribute der Table View Cell selbst. Sobald ich die Einrückbreite dort eingestellt habe, habe ich angefangen, richtige Einrückung zu bekommen. Die indentationLevel Eigenschaft begann zu arbeiten. Sogar die - (NSInteger)tableView: indentationLevelForRowAtIndexPath: war nützlich.

Grundsätzlich scheint es, als ob die indentationWidth Eigenschaft zugunsten der "Einzug Breite" im Storyboard ignoriert wird.

Dies war mit Xcode 5.0.2 Targeting iOS 7.

3

Dies ist ein Bug in iOS 7 zu sein scheint, wenn Sie keine benutzerdefinierten Zellen verwenden.

Die Einstellung indentationLevel oder indentationWidth innerhalb tableView:cellForRowAtIndexPath: hat keine Auswirkungen auf das Layout der Zelle, wenn es Zeit ist, es anzuzeigen.

Betrachten wir zum Beispiel den folgenden Code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    BOOL isIndented = indexPath.row % 2; 

    cell.textLabel.text = isIndented ? @"Indented" : @"Not indented"; 
    cell.indentationLevel = isIndented; 
} 

ich Screenshots nicht genug Ruf zu schreiben, aber das Ergebnis ist anders zwischen iOS 6 und iOS 7. Dies ist mit Xcode 5 und iOS 7 SDK.

+0

Können Sie eine Lösung oder einen Workaround bereitstellen? –

+2

Die Problemumgehung besteht darin, eine benutzerdefinierte Zelle zu verwenden, selbst wenn sie einen Standardzellenstil emulieren soll. Erstellen Sie einfach eine neue Unterklasse von UITableViewCell, und je nachdem, ob Sie Storyboards oder Nib-Dateien verwenden, konfigurieren Sie eine Prototypzelle oder registrieren Sie eine Nib-Datei, die von Ihrer Zellenunterklasse verwendet werden kann. – Skyboat

0

Ich weiß, diese Frage ist 4 Jahre alt, aber wenn man bereits mit einer benutzerdefinierten Unterklasse von UITableViewCell ist, und Sie bereits hinzugefügt Ihre Ansichten als Subviews von contentView sicherstellen, dass Sie nicht überschreiben layoutSubviews in deine Zelle. Wenn dies der Fall ist, müssen Sie die Grenzen/Mitte oder den Rahmen von contentView manuell in layoutSubviews anpassen.

Verwandte Themen