Voici mon code de travail extrait:
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)
J'ai ajouté 4px pour le calcul de la hauteur, parce que sans ces 4px, il y a une ligne manquante.
J'utilise ce bout de code dans un tableView et ajouter la "hauteur" d'un tableau de NSNumbers et j'ai trouver la bonne hauteur de cellule par défaut textLabel.
Ajouter un peu plus de 4 pixels si vous voulez plus d'espace sous le texte dans la textLabel.
** Mise à JOUR **
Je ne suis pas d'accord avec le "largeur bug de 40px", je crie être le 4px de manque de hauteur, parce que 4px est la hauteur par défaut d'un espace entre une lettre et la limite d'une seule ligne.
Vous pouvez le vérifier avec un UILabel, pour un fontsize de 16 vous avez besoin d'un UILabel hauteur de 20.
Mais si votre dernière ligne n'a pas de "g" ou que ce soit, la mesure pourrait manquer le 4px de hauteur.
J'ai revérifié avec un peu de méthode, j'obtiens un précis de la hauteur de 20,40 ou 60
pour mon label et un droit de la largeur de moins de 300px.
À l'appui de iOS6 et iOS7, vous pouvez utiliser ma méthode:
- (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;
}