これが私の作業コードスニペットです:
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)
計算された高さに4pxを追加しました。これは、これらの4pxがないと、1行が欠落しているためです。
このコードスニペットをtableViewで使用し、NSNumbersの配列に「高さ」を追加すると、デフォルトのtextLabelの正しいセルの高さが得られます。
textLabelのテキストの下にさらにスペースが必要な場合は、さらに4ピクセルを追加します。
****更新****
私は「40pxの幅のバグ」に同意しません。4pxは文字と1行の境界の間のスペースのデフォルトの高さであるため、高さが欠落している4pxであると叫びます。UILabelで確認できます。フォントサイズが16の場合、UILabelの高さは20が必要です。
ただし、最後の行に「g」などが含まれていない場合、測定値は4pxの高さを見逃す可能性があります。
少しの方法で再確認しました。ラベルの正確な高さは20、40、または60で、右の幅は300px未満です。
iOS6とiOS7をサポートするには、次の方法を使用できます。
- (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;
}
****アップグレード****
あなたのコメントのおかげで、私は次のように私の機能をアップグレードしました。sizeWithFontは非推奨であり、XCodeで警告が表示されるため、diagnostic-pragma-codeを追加して、この特定の関数呼び出し/コードブロックの警告を削除しました。
- (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のトピックに加えて、使用するフォントとフォントの太さに応じて、計算は異なる高さの値を返します。私の場合:HelveticaNeue-フォントサイズが16.0のMediumは、1行で20.0の行の高さを返しますが、2行で39.0、4行で78px-> 2行目から始まるすべての行で1pxが欠落していますが必要ですすべての行にfontsize + 4pxの行スペースを設定するには、高さの結果を取得する必要があります。
コーディングするときは、このことを覚えておいてください。
この「問題」に対する機能はまだありませんが、終了したらこの投稿を更新します。