41

この一般的なトピックは、ここで何度も質問されています: テキストの量が変化し、高さが変化する 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 つの異なるサイズが表示されるのはなぜですか? どうすれば修正できますか?

4

3 に答える 3

38

もちろん、解決策は投稿後30秒で明らかです。他の人にも役立つかもしれません...

サイズsizeWithFont:は正解でした。[label sizeToFit]ラベルのフレームの幅が狭くなるため、上記の方法で計算したサイズは正しくありません。同じコードへの後続の呼び出しでは、既に縮小されている可能性のあるフレームから開始されました。

修正は、widthサイズを合わせる前に、フレームを既知の適切な幅にリセットするだけでした。

CGRect labelFrame = label.frame;
labelFrame.size.width = 310;
label.frame = labelFrame;
[label sizeToFit];
于 2010-01-25T22:19:53.367 に答える
12

複数行のラベルの場合は、設定する必要があります

cell.textLabel.numberOfLines = 0;

その後

[cell.textLabel sizeToFit];

ただし、見栄えをよくするには、パディング ピクセルを追加する必要があります。そして、あなたのアプリは素晴らしいものになるでしょう!

于 2011-08-10T03:45:40.773 に答える
7
 titleSize = [title sizeWithFont:[UIFont systemFontOfSize:(CGFloat)17.0]
                                constrainedToSize:CGSizeMake(280, 2000)
                                    lineBreakMode:NSLineBreakByWordWrapping];
于 2013-06-12T04:09:14.213 に答える