この一般的なトピックは、ここで何度も質問されています: テキストの量が変化し、高さが変化する UITableViewCells をレンダリングする方法。標準的な答えは次のとおりです。sizeWithFont:constrainedToSize:lineBreakMode: を使用して、heightForRowAtIndexPath のテーブル ビュー コントローラー デリゲートで高さを計算します。後でセルが描画され、必要に応じて [label sizeToFit] などを使用すると、すべてが魔法のように機能します。
私の問題: sizeWithFont: が実際の描画とは異なる寸法を返すため、一部のセルをラッピングしています。
具体例:
テキストは次のとおりです。「@BillGatesが1993年にNECからセクシーな1/4インチの厚さのスレートを持っていたことを人々は忘れています。今週何が起こっても、ハードウェアに関するものではありません!」
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);
これは、306.000000、84.000000 を返します。(つまり、17px のフォントと 4px の行間隔、21px の先頭の 4 行。) 良い。
ただし、後で実際にセルを描画するとき:
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 は、NIB から UITableViewCell の一部として読み込まれます。IB では、幅 310px に設定しました。)
これは、上記とまったく同じサイズを返すはずです。代わりに、sizeToFit 呼び出し後の寸法として 281.000000、105.000000 を取得します。描画時に 4 行ではなく 5 行になり、テキストがスピルオーバーします。UI にスピルオーバーが表示されます。
したがって、同じテキストに対して、2 つの異なる次元が計算されており、それを理解できません。それはUILabelに関するものですか?内側のマージンはありますか?これはいくつかのテキストで発生し続けますが、他のテキストでは発生しません. ランダムに思えます。このトピックでは、高さの計算と実際の描画の 2 つの処理パスがあることを強調しています。これは私が見ているものと一致しています。しかし、私は正確に何が起こっているのか、それを修正する方法を理解していません。
質問: 計算された 2 つの異なるサイズが表示されるのはなぜですか? どうすれば修正できますか?