it-swarm.dev

Wie kann ich Text in einer UITableViewCell ohne benutzerdefinierte Zelle einschließen?

Dies ist auf dem iPhone 0S 2.0. Die Antworten für 2.1 sind auch in Ordnung, obwohl mir Unterschiede in Bezug auf Tabellen nicht bekannt sind.

Es fühlt sich an, als sollte es möglich sein, Text zum Umschließen zu bekommen, ohne eine benutzerdefinierte Zelle zu erstellen, da UITableViewCell standardmäßig UILabel enthält. Ich weiß, dass ich es schaffen kann, wenn ich eine benutzerdefinierte Zelle erstelle, aber das ist nicht das, was ich erreichen möchte. Ich möchte verstehen, warum mein aktueller Ansatz nicht funktioniert.

Ich habe herausgefunden, dass das Etikett nach Bedarf erstellt wird (da die Zelle Text- und Bildzugriff unterstützt, sodass die Datenansicht erst erstellt wird, wenn dies erforderlich ist).

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

dann bekomme ich ein gültiges Label, aber das Setzen von numberOfLines für (und lineBreakMode) funktioniert nicht - ich bekomme immer noch einen einzeiligen Text. In UILabel gibt es viel Höhe, damit der Text angezeigt werden kann. Ich gebe nur einen großen Wert für die Höhe in heightForRowAtIndexPath zurück.

150
Airsource Ltd

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

In Ihrer cellForRowAtIndexPath:-Funktion. Beim ersten Erstellen Ihrer 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 habe. Dadurch kann es so viele Zeilen wie nötig verwenden.

Als nächsten Schritt geben Sie an, wie groß Ihre UITableViewCell sein wird, also tun Sie dies 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 der zurückgegebenen Zellenhöhe 20 hinzugefügt, weil ich einen kleinen Puffer um meinen Text mag.

273
Tim Rupe

Antwort von Tim Rupe für iOS7 aktualisiert:

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;
}
15
ddiego

Ein kurzer Kommentar/eine Antwort, um meine Erfahrung aufzuzeichnen, als ich das gleiche Problem hatte. Trotz der Verwendung der Codebeispiele wurde die Zellenhöhe der Tabellensicht angepasst, aber das Etikett in der Zelle wurde immer noch nicht richtig angepasst. Die Lösung bestand darin, dass ich meine Zelle aus einer benutzerdefinierten NIB-Datei lade, was nach der Zellenhöhe geschieht in eingestellt.

Ich hatte meine Einstellungen in der NIB-Datei, um den Text nicht zu umbrechen, und hatte nur eine Zeile für das Etikett. Die Einstellungen der NIB-Datei überschrieben die Einstellungen, die ich im Code vorgenommen habe.

Die Lektion, die ich genommen habe, war, immer darauf zu achten, wie der Zustand der Objekte zu jedem Zeitpunkt ist - sie wurden möglicherweise noch nicht erstellt! ... hd jemand in der Leitung.

3

Wenn wir nur Text in der UITableView-Zelle hinzufügen möchten, benötigen wir nur zwei Delegaten, um damit zu arbeiten (keine zusätzliche UILabels-Angabe erforderlich).

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Diese Lösung hat für mich funktioniert: -

-(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 ein veränderbares Array, von dem ich meine Daten bekomme. 

EDIT: - Hier ist das Array, das ich genommen habe.

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"];
2
Arshad Parwez

Jetzt können die Tabellenansichten Zellen zur Größenanpassung aufweisen. Richten Sie die Tabellenansicht wie folgt ein

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

Apple-Referenz

1
Jason

Ich fand das recht einfach und geradlinig. 

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

für z.B. :

[self.tableView setRowHeight:80.0f];

Dies ist vielleicht der beste/Standardansatz dafür, aber es hat in meinem Fall funktioniert.

0

Versuchen Sie meinen Code in Swift. Dieser Code funktioniert auch für normale UILabels.

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 anrufen

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

Ich verwende die folgenden Lösungen.

Die Daten werden separat in einem Mitglied bereitgestellt:

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

Die Handhabung kann einfach in cellForRowAtIndexPath..__ erfolgen. Definieren Sie die Zelle/definieren Sie die Schriftart und weisen Sie diese Werte dem Ergebnis "cell" ..__ zu. Beachten Sie, dass die numberoflines auf "0" gesetzt ist .

- (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öhe des umschlossenen Textes ..__ Die Größe der Codierung muss sich auf die Breite Ihrer Zelle beziehen. Für iPad ist dies 1024 .. Für iPhone und 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;    
}
0
Vincent