Domanda

Questo è su iPhone 0S 2.0. Anche le risposte per 2.1 vanno bene, anche se non sono a conoscenza di differenze riguardo alle tabelle.

Sembra che dovrebbe essere possibile ottenere il testo da avvolgere senza creare una cella personalizzata, poiché un UITableViewCell contiene un UILabel per impostazione predefinita. So che posso farlo funzionare se creo una cella personalizzata, ma non è quello che sto cercando di ottenere - voglio capire perché il mio approccio attuale non funziona.

Ho capito che l'etichetta è stata creata su richiesta (poiché la cella supporta l'accesso al testo e all'immagine, quindi non crea la visualizzazione dei dati fino a quando non è necessario), quindi se faccio qualcosa del genere:

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

quindi ottengo un'etichetta valida, ma l'impostazione numberOfLines su questo (e lineBreakMode) non funziona - Ricevo ancora testo a riga singola. C'è un sacco di altezza in UILabel per la visualizzazione del testo: sto solo restituendo un valore elevato per l'altezza in heightForRowAtIndexPath .

È stato utile?

Soluzione

Ecco un modo più semplice e funziona per me:

All'interno della funzione cellForRowAtIndexPath: . La prima volta che crei la tua cella:

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

Noterai che ho impostato il numero di righe per l'etichetta su 0. Ciò consente di utilizzare tutte le righe necessarie.

La parte successiva è specificare quanto sarà grande il tuo UITableViewCell , quindi fallo nella tua funzione heightForRowAtIndexPath :

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

Ho aggiunto 20 alla mia altezza di cella restituita perché mi piace un piccolo buffer attorno al mio testo.

Altri suggerimenti

Aggiornamento della risposta di Tim Rupe per 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;
}

Un breve commento / risposta per registrare la mia esperienza quando ho avuto lo stesso problema. Nonostante si usassero gli esempi di codice, l'altezza della cella della vista tabella si stava adeguando, ma l'etichetta all'interno della cella non stava ancora regolando correttamente - la soluzione era che stavo caricando la mia cella da un file NIB personalizzato, che si verifica dopo l'altezza della cella è regolata.

E avevo le mie impostazioni all'interno del file NIB per non avvolgere il testo e avevo solo 1 riga per l'etichetta; le impostazioni del file NIB stavano sovrascrivendo le impostazioni che ho modificato all'interno del codice.

La lezione che ho preso è stata quella di assicurarmi di tenere sempre presente lo stato degli oggetti in ogni momento: potrebbero non essere ancora stati creati! ... hth qualcuno lungo la linea.

Se vogliamo aggiungere solo testo nella cella UITableView , abbiamo bisogno solo di due delegati con cui lavorare (non è necessario aggiungere UILabels )

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Questa soluzione ha funzionato per me: -

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

Qui la stringa mutArr è un array mutabile da cui sto ottenendo i miei dati.

EDIT: - Ecco l'array che ho preso.

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"];

Ora le visualizzazioni di tabella possono avere celle con ridimensionamento automatico. Imposta la vista tabella come segue

tableView.estimatedRowHeight = 85.0 // usa una stima appropriata tableView.rowHeight = UITableViewAutomaticDimension

Riferimento Apple

Uso le seguenti soluzioni.

I dati sono forniti separatamente in un membro:

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

La gestione può essere facilmente eseguita in cellForRowAtIndexPath . Definisci la cella / definisci il carattere e assegna questi valori al risultato "cella". Nota che numberoflines è impostato su " 0 " ;, il che significa prendere ciò che è necessario.

- (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 , calcolo le altezze del testo racchiuso. Le dimensioni del corpo devono essere correlate alla larghezza della tua cella. Per iPad questo deve essere 1024. Per iPhone e 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;    
}

L'ho trovato abbastanza semplice e diretto:

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

per es. :

[self.tableView setRowHeight:80.0f];

Questo potrebbe essere o non essere l'approccio migliore / standard per farlo, ma ha funzionato nel mio caso.

Prova il mio codice rapidamente. Questo codice funzionerà anche con UILabels normali.

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

Adesso chiama semplicemente così

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

Penso che questa sia una soluzione migliore e più breve. Basta formattare UILabel ( textLabel ) della cella per calcolare automaticamente l'altezza specificando sizeToFit e tutto dovrebbe andare bene.

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

Non credo che tu possa manipolare un UITableViewCell privato UILabel per farlo. Puoi aggiungere un nuovo UILabel alla cella e utilizzare numberOfLines con sizeToFit per ridimensionarlo in modo appropriato. Qualcosa del tipo:

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];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top