Hier ist mein Arbeitscode-Snippet:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];
NSString *headline = [dict objectForKey:@"title"];
UIFont *font = [UIFont boldSystemFontOfSize:18];
CGRect rect = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
CGFloat height = roundf(rect.size.height +4)
Ich habe der berechneten Höhe 4 Pixel hinzugefügt, da ohne diese 4 Pixel eine Zeile fehlt.
Ich verwende dieses Code-Snippet in einer Tabellenansicht und füge die "Höhe" einem Array von NSNumbers hinzu, und ich erhalte die richtige Zellenhöhe für das Standard-TextLabel.
Fügen Sie 4 weitere Pixel hinzu, wenn Sie mehr Platz unter dem Text im textLabel wünschen.
**** UPDATE ****
Ich bin mit dem "Breitenfehler von 40px" nicht einverstanden, ich rufe die 4px der fehlenden Höhe, weil 4px die Standardhöhe eines Leerzeichens zwischen einem Buchstaben und dem Rand einer einzelnen Zeile ist. Sie können dies mit einem UILabel überprüfen. Für eine Schriftgröße von 16 benötigen Sie eine UILabel-Höhe von 20.
Aber wenn Ihre letzte Zeile kein "g" oder was auch immer enthält, könnte die Messung die 4px Höhe verfehlen.
Ich habe es mit einer kleinen Methode erneut überprüft. Ich erhalte eine genaue Höhe von 20,40 oder 60 für mein Etikett und eine richtige Breite von weniger als 300 Pixel.
Um iOS6 und iOS7 zu unterstützen, können Sie meine Methode verwenden:
- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (iosVersion >= 7.0) {
rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
}
NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
return rect.size.height;
}
**** AKTUALISIERUNG ****
Dank Ihrer Kommentare habe ich meine Funktion wie folgt aktualisiert. Da sizeWithFont veraltet ist und Sie in XCode eine Warnung erhalten, habe ich den Diagnose-Pragma-Code hinzugefügt, um die Warnung für diesen bestimmten Funktionsaufruf / Codeblock zu entfernen.
- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
}
return ceil(rect.size.height);
}
Zusätzlich zum 4px-Thema: Je nachdem, welche Schriftart und Schriftgröße Sie verwenden, gibt die Berechnung unterschiedliche Höhenwerte zurück. In meinem Fall: HelveticaNeue-Medium mit einer Schriftgröße von 16,0 gibt eine Zeilenhöhe von 20,0 für eine einzelne Zeile, aber 39,0 für zwei Zeilen zurück, 78 Pixel für 4 Zeilen -> 1 Pixel fehlt für jede Zeile - beginnend mit Zeile 2 - aber Sie möchten Um Ihre Schriftgröße + 4px Zeilenabstand für jede Zeile zu haben, müssen Sie ein Höhenergebnis erhalten.
Bitte beachten Sie dies beim Codieren!
Ich habe noch keine Funktion für dieses "Problem", aber ich werde diesen Beitrag aktualisieren, wenn ich fertig bin.