it-swarm.com.de

wie wird die Höhe der Tabellenzelle dynamisch in Abhängigkeit von der Länge der Textbeschriftung festgelegt?

Ich versuche, Obj-C und iOS-Programmierung zu lernen, bin aber noch sehr neu. Ich beschloss, eine einfache Reddit-Client-Anwendung zu erstellen. Ich versuche, die Beiträge auf der Startseite in einer UITableView anzuzeigen, wobei jeder Beitrag durch eine eigene Zelle dargestellt wird.

In der Zelle setze ich den Titel wie folgt:

cell.textLabel.numberOfLines = 0;
cell.textLabel.text = [[tempDictionary objectForKey:@"data"] objectForKey:@"title"];   
[cell.textLabel sizeToFit];

Die Zelle schneidet sich jedoch selbst ab, wenn der Titeltext zu lang ist. Hier ist ein Bild:

enter image description here

Wie kann ich meine Zellen automatisch so einstellen, dass sie längere Titelbezeichnungen aufnehmen, ohne andere Zellen oder die Detailtextbezeichnung zu überschneiden?

Vielen Dank für jede Hilfe!

13
Prefix

Für das neue iOS 8 gibt es einen neuen Weg, dies einfach zu machen.

Es gibt einen neuen Parameter, der Ihre Zellenhöhe in Bezug auf Ihre Auto-Layout-Einschränkungen berechnet. Dies ist UITableViewAutomaticDimension. Sie können es in der viewWillAppear-Methode Ihres View-Controllers verwenden.

Ziel c:

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  self.tableView.estimatedRowHeight = 70.0; // for example. Set your average height 
  self.tableView.rowHeight = UITableViewAutomaticDimension;
  [self.tableView reloadData];
}

Schnell:

override func viewWillAppear(animated: Bool) {
    self.tableView.estimatedRowHeight = 70 // for example. Set your average height 
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.reloadData()

} 

Arbeiten Sie nett und wie Sie möchten, an Ihrem Beispiel. Ich füge in viewDidLoad Höhenwerte hinzu und viewWillAppear nur reloadData (). Es gibt auch nützliche source .

Aus der Dokumentation: The default value of rowHeight is UITableViewAutomaticDimension. Ich lasse den Code für den Moment so wie er ist, aber bedenke, dass du in iOS 8+ keine Zeilenhöhe einstellen musst.

Das wichtigste, was Sie tun müssen, ist, alle Einschränkungen explizit festzulegen, z. nach vorne, nachlaufend, oben und unten. Versuchen Sie es zuerst, ohne oben Codezeilen hinzuzufügen.

18
Dima Deplov

Sie sollten die Dokumentationsreferenz für auschecken 

-[UITableViewDelegate tableView:heightForRowAtIndexPath:]

Im Wesentlichen müssen Sie den Text selbst messen, um die korrekten Abmessungen für jede Tabellenzeile zurückzugeben. Wenn es sich nur um NSStrings handelt, die scheinbar aus Ihrem Screenshot stammen, können Sie die UIKit-Zusätze /NSString verwenden, um sie zu messen, z.

-[NSString sizeWithFont:constrainedToSize:]

Wo die eingeschränkte Größe eine unendliche Höhe haben könnte, aber die Breite der Inhaltsansicht Ihrer Tabellenzelle. 

Wenn es sich um Zeichenfolgen handelt, gibt es eine ähnliche Methode in den NSAttributedString-UIKit-Zusätzen namens boundingRectWithSize:options:context:.

11
PHD

Es kommt vor, dass meine App TidBITS News genau das tut , was Sie beschreiben . Und ich glaube, es war eine der ersten Apps, die herausfanden , wie es zu tun ist; Zumindest kannte ich zu dem Zeitpunkt, als ich es schrieb, keine anderen Apps, die dies taten. Ich habe meine Methode in meinem Programmierbuch für iOS 4 veröffentlicht, und seitdem ist sie alltäglich geworden (obwohl ich nicht sage, dass es jeder von mir bekommen hat) ist im Grunde nur ein vernünftiger Weg, sich dem anzunähern.

Hier ist die Erklärung aus der aktuellen Version meines Buches:

http://www.apeth.com/iOSBook/ch21.html#_variable_row_heights

Wie Sie sehen, besteht der Trick darin, die Höhen aller Zeilen im Voraus zu ermitteln, indem Sie sizeWithFont:constrainedToSize: auf dem Etikett mit den Daten aufrufen Es enthält in jeder Zeile und führt die erforderlichen Berechnungen durch. Dies liegt daran, dass tableView:heightForRowAtIndexPath: immer wieder von vorne aufgerufen wird, um die Höhen von jeder Zeile zu bestimmen, bevor Sie nach den Daten gefragt werden.

Wenn Sie dann nach cellForRowAtIndexPath: gefragt werden, verwenden Sie die zuvor abgeleiteten Ergebnisse, um die Zelle in der zuvor berechneten Höhe anzuordnen.

Am Github Ich habe auch ein vollständiges Projektbeispiel zum Herunterladen, das Sie lesen und ausführen können. Hier erfahren Sie, wie Sie dies mit Einschränkungen tun können (nur iOS 6 und höher). Suchen Sie nach dem Beispiel ch21 mit variableHeights im Namen.

2
matt

In Ihrer tableView-Methode heightForRowAtIndexPath delegate:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath   *)indexPath
{

if (indexPath.row == 2) {
  Message *aMessage = [customTableViewArray objectAtIndex:indexPath.row];

  if ( [aMessage.msgBody length] <= 0 )
    aMessage.msgBody = @"     ";
    CGSize constraint = CGSizeMake(450, 40000.0f);
    CGSize size = [aMessage.msgBody sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];
    size.height = MAX(size.height,36);

    return 136+size.height;

} else if(indexPath.row > 1) {

      Message *aMessage = [customTableViewArray objectAtIndex:indexPath.row];

      if ( [aMessage.msgBody length] <= 0 )
        aMessage.msgBody = @"     ";
        CGSize constraint = CGSizeMake(450, 40000.0f);
        CGSize size = [aMessage.msgBody sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];
        size.height = MAX(size.height,36);

        return 100+size.height;

} else {
      return 146;
   }

}

Ich entschuldige mich, ich hatte nur einen Teil des Codes eingefügt. Das ist das Ganze. Wenn also die Nachricht leer ist, wird sie zu einer Größe. Dann wird im Sonst-if-Teil der Anweisung die Größe der Nachricht abgerufen und die Zellengröße auf dieser Nachrichtengröße basiert.

0
iOSGuru248