İşte çalışma kod pasajım:
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)
Hesaplanan yüksekliğe 4px ekledim, çünkü bu 4px olmadan bir satır eksik.
Bu kod parçacığını bir tableView içinde kullanıyorum ve bir NSNumber dizisine "yüksekliği" ekliyorum ve varsayılan textLabel için doğru hücre yüksekliğini alıyorum.
TextLabel'deki metnin altında daha fazla boşluk istiyorsanız 4 piksel daha ekleyin.
**** GÜNCELLEME ****
"40px genişlik hatası" na katılmıyorum, 4px eksik yüksekliğin 4px olduğunu haykırıyorum çünkü 4px bir harf ile tek bir satırın sınırı arasındaki boşluğun varsayılan yüksekliğidir. Bunu bir UILabel ile kontrol edebilirsiniz, 16 yazı tipi boyutu için 20 UILabel yüksekliğine ihtiyacınız vardır.
Ancak son satırınızda "g" veya herhangi bir şey yoksa, ölçüm 4px yüksekliği eksik olabilir.
Küçük bir yöntemle tekrar kontrol ettim, etiketim için doğru yükseklik 20,40 veya 60 ve doğru genişlik 300 pikselden az.
İOS6 ve iOS7'yi desteklemek için benim yöntemimi kullanabilirsiniz:
- (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;
}
**** YÜKSELT ****
Yorumlarınız sayesinde, işlevimi aşağıdaki gibi yükselttim. SizeWithFont kullanımdan kaldırıldığından ve XCode'da bir uyarı alacağınız için, bu özel işlev çağrısı / kod bloğu için uyarıyı kaldırmak için tanılama-pragma kodunu ekledim.
- (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);
}
4px konusuna ek olarak: Kullandığınız yazı tipi ve yazı tipi ağırlığına bağlı olarak, hesaplama farklı yükseklik değerleri döndürür. Benim durumumda: 16.0 yazı tipi boyutuna sahip HelveticaNeue-Medium, tek bir satır için 20.0 satır yüksekliği, iki satır için 39.0, 4 satır için 78px - her satır için> 1px eksik - 2. satırdan başlayarak - ancak istediğiniz yazı tipi boyutunuzu + 4px satır aralığına sahip olmak için her satır için bir yükseklik sonucu almanız gerekir.
Lütfen kodlama sırasında bunu aklınızda bulundurun!
Henüz bu "sorun" için bir işlevim yok, ancak bitirdiğimde bu gönderiyi güncelleyeceğim.