2010-01-25 8 views
39

Dieses allgemeine Thema wurde hier mehrfach gestellt: wie UITableViewCells mit unterschiedlichem Text und damit unterschiedlicher Höhe gerendert werden. Die kanonische Antwort lautet: Sie berechnen die Höhe in Controller-Delegaten der Tabellenansicht in heightForRowAtIndexPath mit sizeWithFont: constrainedToSize: lineBreakMode :. Später wird die Zelle gezeichnet und du verwendest bei Bedarf etwas wie [label sizeToFit] und alles funktioniert wie Magie.Mehrzeilige Texthöhe für UILabel/UITableViewCell berechnen: Unterschiedliche Ergebnisse bei der Berechnung vs tatsächlicher Zeichnung

Mein Problem: Ich bekomme für einige Zellen Wrapping, weil sizeWithFont: verschiedene Dimensionen von tatsächlichen Zeichnung zurückgibt.

Ein konkretes Beispiel:

Der Text ist dies: „! Die Leute vergessen, dass @BillGates 04.01-Zoll dicke Schiefer zurück von NEC 1993 einen sexy hatte Was auch immer in dieser Woche über Hardware wird nicht geschieht“

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

Dies gibt zurück: 306.000000, 84.000000. (ZB 4 Zeilen mit 17px Font und 4px Zeilenabstand, 21px Zeilenabstand.) Gut.

jedoch später, wenn tatsächlich die Zelle Zeichnung:

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 als Teil UITableViewCell von NIB geladen In IB Ich stelle es auf 310px breit)

Dies sollte zurückkehren genau gleiche Größe wie oben. Stattdessen bekomme ich 281.000000, 105.000000 als die Dimensionen nach sizeToFit aufrufen. Es sind jetzt 5 Zeilen zum Zeichnen statt 4, und der Text springt über, ich sehe den Spillover in der Benutzeroberfläche.

Also, für den gleichen Text, bekomme ich zwei verschiedene Dimensionen berechnet, und kann es nicht herausfinden. Ist es etwas mit UILabel? Hat es innere Ränder? Das passiert bei einigen Texten, aber nicht bei anderen, und ich habe es nicht auf etwas Bestimmtes über die Saiten zurückgeführt; scheint zufällig. This topic hebt hervor, dass es zwei Verarbeitungsdurchläufe gibt: Berechnen der Höhe gegenüber dem tatsächlichen Zeichnen. Das stimmt mit dem überein, was ich sehe. Aber ich verstehe nicht, was genau vorgeht oder wie es zu beheben ist.

Die Frage: Warum sehe ich zwei verschiedene berechnete Größen, und wie repariere ich es?

Antwort

36

Natürlich ist die Lösung offensichtlich Sekunden nach der Veröffentlichung. Vielleicht nützlich für andere auch ...

Die Größe von sizeWithFont: war korrekt. Die Größen, die ich auf die obige Weise berechnet habe, waren falsch, weil [label sizeToFit] die Breite des Etikettenrahmens reduziert. Bei nachfolgenden Aufrufen desselben Codes begann er mit dem Rahmen, der möglicherweise bereits reduziert wurde.

Das Update war einfach den Rahmen width auf eine bekannte gute Breite zurückgesetzt, bevor zu passen Sizing:

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

danke, das war, was ich gesucht habe: ** CGSize labelSize; labelSize = UILabelName.frame.size; ==> labelSize.height ** – cV2

11

Für mehrzeilige Etiketten Sie

cell.textLabel.numberOfLines = 0; 

und dann

[cell.textLabel sizeToFit]; 
gesetzt brauchen

Aber für hübsche Ansicht müssen Sie einige Füllpixel hinzufügen. Und deine App wird großartig sein!

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