2010-01-25 11 views
39

Questo argomento generale è stato posto più volte qui: come rendere UITableViewCells con quantità variabili di testo e quindi altezza variabile. La risposta canonica è: si calcola l'altezza nella delegazione del controller della vista tabella in heightForRowAtIndexPath utilizzando sizeWithFont: constrainedToSize: lineBreakMode :. Più tardi, la cella viene disegnata e tu usi qualcosa come [label sizeToFit] se necessario, e tutto funziona come per magia.Calcolo dell'altezza del testo multilinea per UILabel/UITableViewCell: risultati diversi durante il calcolo rispetto al disegno reale

Il mio problema: sto ricevendo il wrapping per alcune celle perché sizeWithFont: restituisce diverse dimensioni dal disegno reale.

Un esempio specifico:

Il testo è questo: "! La gente dimentica che @BillGates avuto un sexy 1/4 di pollice di spessore ardesia nel 1993 da NEC Qualunque cosa accada questa settimana non sarà riguardo all'hardware"

CGSize theSize = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(310.0f, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap]; 
NSLog(@"calculated size for %@: %f, %f",text, theSize.width, theSize.height); 

Questo restituisce: 306,000000, 84,000000. (I.e 4 righe con font 17px e 4px linespacing, 21px leading.) Buono.

Tuttavia, più tardi, quando il prelievo del cellulare:

label = (UILabel *)[cell viewWithTag:3]; 
label.text = [NSString stringWithFormat:@"%@", text]; 
label.lineBreakMode = UILineBreakModeWordWrap; 
label.font = [UIFont systemFontOfSize:17.0f]; 
CGSize labelSize; 
labelSize = label.frame.size; 
NSLog(@"label size before resizing: %f, %f", labelSize.width, labelSize.height); 
[label sizeToFit]; 
labelSize = label.frame.size; 
NSLog(@"label size after resizing: %f, %f for text %@", labelSize.width, labelSize.height,text); 

(.. UILabel viene caricato come parte di UITableViewCell da NIB In IB ho impostato a 310px di larghezza)

Questo deve restituire esattamente stesse dimensioni di cui sopra. Invece, ottengo 281,000000, 105,000000 come le dimensioni dopo la chiamata sizeToFit. Ora sono 5 righe in fase di disegno anziché 4 e il testo si rovescia, vedo lo spillover nell'interfaccia utente.

Quindi, per lo stesso testo, sto calcolando due dimensioni diverse e non riesco a capirlo. È qualcosa su UILabel? Ha dei margini interni? Questo continua ad accadere per alcuni testi ma non per altri, e non l'ho rintracciato in qualcosa di particolare riguardo agli archi; sembra casuale. This topic evidenzia che esistono due passaggi di elaborazione: calcolo dell'altezza rispetto al disegno corrente. Questo è coerente con quello che sto vedendo. Ma non capisco cosa sta succedendo esattamente o come risolverlo.

La domanda: perché vedo due diverse dimensioni calcolate e come risolverlo?

risposta

36

Ovviamente, la soluzione è ovvia secondi dopo la pubblicazione. Forse utile anche ad altri ...

La dimensione di sizeWithFont: era corretta. Le dimensioni che ho calcolato nel modo precedente non erano corrette, poiché [label sizeToFit] riduce la larghezza del frame dell'etichetta. Alle successive chiamate allo stesso codice, ha iniziato con il frame che potrebbe essere già stato ridotto.

La correzione è stato quello di ripristinare semplicemente la cornice width ad una buona larghezza conosciuto prima dimensionamento per adattarsi:

CGRect labelFrame = label.frame; 
labelFrame.size.width = 310; 
label.frame = labelFrame; 
[label sizeToFit]; 
+0

grazie, era quello che stavo cercando: ** CGSize labelSize; labelSize = UILabelName.frame.size; ==> labelSize.height ** – cV2

11

Per le etichette multilinea che è sufficiente impostare

cell.textLabel.numberOfLines = 0; 

e poi

[cell.textLabel sizeToFit]; 

Ma per la bella visualizzazione è necessario aggiungere dei pixel di riempimento. E la tua app sarà fantastica!

5
titleSize = [title sizeWithFont:[UIFont systemFontOfSize:(CGFloat)17.0] 
           constrainedToSize:CGSizeMake(280, 2000) 
            lineBreakMode:NSLineBreakByWordWrapping]; 
Problemi correlati