Frage

Dies ist auf dem iPhone 0S 2.0. Antworten für 2.1 sind auch in Ordnung, obwohl ich keine Kenntnis über Unterschiede in Bezug auf Tabellen.

Es fühlt sich an wie soll es möglich sein, Text zu erhalten, ohne eine benutzerdefinierte Zelle zu wickeln, da ein UITableViewCell eine UILabel standardmäßig enthält. Ich weiß, ich kann es funktioniert, wenn ich eine benutzerdefinierte Zelle erstellen, aber das ist nicht das, was ich versuche zu erreichen -. Ich möchte verstehen, warum meine gegenwärtige Ansatz nicht funktioniert

Ich habe herausgefunden, dass das Etikett auf Verlangen wird (da die Zelle Text- und Bildzugriff unterstützt, so dass es nicht die Datensicht bis nötig erstellen), also wenn ich so etwas tun:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

dann bekomme ich ein gültiges Label, sondern Einstellung numberOfLines auf diesem (und linebreak) funktioniert nicht - ich immer noch einzige Zeile Text bekommen. Es gibt viel Höhe im UILabel für den Text anzuzeigen. - Ich bin nur einen großen Wert für die Höhe in heightForRowAtIndexPath Rückkehr

War es hilfreich?

Lösung

Hier ist ein einfacher Weg, und es funktioniert für mich:

In Ihrer cellForRowAtIndexPath: Funktion. Das erste Mal, wenn Sie erstellen Ihre Zelle:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

Sie werden feststellen, dass ich die Anzahl der Zeilen für das Label auf 0 gesetzt Das es so viele Zeilen kann verwendet werden, wie es braucht.

Der nächste Teil ist zu bestimmen, wie groß Ihre UITableViewCell sein wird, so zu tun, dass in Ihrer heightForRowAtIndexPath Funktion:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

Ich habe 20 meinen zurückzuZellenHöhe, weil ich einen wenig Puffer um meinen Text mögen.

Andere Tipps

Aktualisiert Tim Rupe Antwort für iOS7:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}

Ein kurzer Kommentar / Antwort meiner Erfahrung aufzuzeichnen, wenn ich hatte das gleiche Problem. Trotz der Codebeispiele wurde unter Verwendung Einstellen der Tabellenansicht Zellenhöhe, aber das Etikett im Inneren der Zelle wurde noch nicht richtig eingestellt - Lösung war, dass ich lade meine Zelle aus einer benutzerdefinierten NIB-Datei, die nach geschieht die Zellenhöhe in eingestellt.

Und ich hatte meine Einstellungen in der NIB-Datei Text nicht umgebrochen und haben nur 1 Zeile für das Etikett; die NIB-Datei Einstellungen wurden die Einstellungen überschreiben ich in dem Code angepasst.

Die Lektion, die ich war nahm um sicherzustellen, dass im Auge zu immer tragen, was der Zustand der Objekte zu jedem Zeitpunkt ist - sie könnten noch nicht erstellt worden sind! ... hth jemand auf der ganzen Linie.

Wenn wir nur Text in UITableView Zelle hinzuzufügen, brauchen wir nur zwei Delegierte, mit zu arbeiten (keine Notwendigkeit, zusätzliche UILabels hinzufügen)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Diese Lösung funktioniert für mich: -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

Hier ist der String mutArr ist ein veränderliches Array, aus dem ich meine Daten immer bin.

EDIT: -. Hier ist die Anordnung, die ich nahm

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];

Nun können die Tableviews haben selbst Sizing Zellen. Stellen Sie die Tabellenansicht wie folgt

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Apple-Referenz

Ich verwende die folgenden Lösungen.

Die Daten werden zur Verfügung gestellt separat in einem Mitglied:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

Die Handhabung kann leicht in cellForRowAtIndexPath erfolgen. Definiert die Zelle / definiert die Schriftart und ordnet diese Werte zu dem Ergebnis „Zelle“. Beachten Sie, dass die numberoflines wird auf „0“ gesetzt, was bedeutet, das, was benötigt wird.

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

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

In heightForRowAtIndexPath, berechne ich die Höhen des umwickelten Text. Die boding Größe ist auf die Breite der Zelle in Beziehung gesetzt werden. Für iPad wird diese 1024 sein. Für iPhone en iPod 320.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}

Ich fand das ganz einfach und unkompliziert sein:

[self.tableView setRowHeight:whatEvereight.0f];

für z.B. :

[self.tableView setRowHeight:80.0f];

Dies kann oder kann nicht der beste / Standard-Ansatz, dies zu tun, aber es funktionierte in meinem Fall.

meinen Code in schnellen Versuchen. Dieser Code wird auch für normale UILabels arbeiten.

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Jetzt einfach so nennen

cell.textLabel.lblFunction()//Replace your label name 

Ich denke, dies ist eine bessere und kürzere Lösung. formatieren Sie einfach die UILabel (textLabel) der Zelle automatisch berechnet, für die Höhe von sizeToFit und alles Angabe sollte in Ordnung sein.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}

Ich glaube nicht, dass Sie eine Basis UITableViewCell's private UILabel, dies zu tun manipulieren können. Sie könnten eine neue UILabel in der Zelle selbst hinzufügen und sie mit numberOfLines Größe entsprechend verwenden sizeToFit. So etwas wie:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top