2013-10-03 7 views
12

回避策や現在私がここで間違っていることを知っていますか?NSString boundingRectWithSize境界が尊重されていない

CGSize boundingSize = CGSizeMake(288, 9999); 

CGRect boundingRect = [text boundingRectWithSize:boundingSize 
               options:NSStringDrawingUsesLineFragmentOrigin 
               attributes:[NSDictionary dictionaryWithObjectsAndKeys:theFont, NSFontAttributeName, nil] 
               context:nil]; 

コードはiOS7(電話とSIMの両方の)上で実行サイズが返さ15.5の高さと幅の広い416.3です。明らかに、boundingRectWithSizeは無視されています。他の誰かがこれを尋ねてきましたか?誰かにそれを修正する方法のアイデアがあるか、誰かが私が間違っているところを指摘することができますか?

+0

これを把握しましたか? –

+0

私は同じ問題を抱えています –

答えて

3

Apple documentationあたりとして:

あなたは 文字列を描画するために必要なスペースを計算するために、このメソッドを使用することができます。 sizeパラメータで指定する制約は、文字列のサイズを設定するレンダラーのガイド です。ただし、このメソッドによって返される実際の 境界矩形は、文字列全体をレンダリングするために追加の領域が必要な場合は、 制約よりも大きくなる可能性があります。 通常、レンダラーは幅の制約を保持し、必要に応じて高さの制限を調整します( )。

固定フォントと小さすぎるスペースを指定した場合、何かが与えられます。この場合、それはバウンディングスペースです。私はあなたがラインラッピングを期待していると思います。 288の幅で合理的な折り返しが可能ですか?

+2

それは良いですが、よく、私は288幅と9999高いスペースにテキストを描画するように求めています。幅416、高さ15の値を戻しています。それは明らかにそれが高さのために十分なスペースを与えられています。私はちょうど幅を固定し、それは私に高さを返すが、そこにいくつかの問題があるようだ。私はちょうど行方不明になっている行を壊す何かがありますか? – BrettS

+0

改行は改行に設定され、自動縮小は固定フォントサイズに設定されます。 – BrettS

+0

'drawInRect:'で指定したスペースに描画するように求めたらどうなりますか? –

1

これは古い質問ですが、問題の回避策が見つかりました。以下のコード例は、最初に指定されたテキストに基づいて、可変高さを与えるために、コード以下その使用後)

#define MIN_HEIGHT 10.0f 

2最小高さのマクロを作成する)

1です。しかし、このためには、UILabelのフレームを指定するか、テキストの表示に使用するものを指定する必要があります。

// Initialize UILabel with initial frame. 
UILabel *lblMakeModel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 180, 50)]; 
// Set numberOfLines as zero 
lblMakeModel.numberOfLines = 0; 
// Set text here 
lblMakeModel.text = @"sdbsbdjhsbdhjsbdhjasd bhbdhjasbdsahjdbahjsdbjhsd bdhjsabdhjsbdhsbdhsad dhbsadbasdhbsajhdbsadyogi"; 
// create a constraint for fixed width and maximum 20000 height. 
CGSize constraint = CGSizeMake(lblMakeModel.frame.size.width, 20000.0f); 
// Get the CGRect with the given constraint for the text of UILabel 
CGRect textRect = [lblMakeModel.text boundingRectWithSize:constraint 
             options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
             attributes:@{NSFontAttributeName:lblMakeModel.font} 
             context:nil]; 

// Set LineBreakMode for UIlabel 
[lblMakeModel setLineBreakMode:NSLineBreakByWordWrapping]; 
[lblMakeModel setAdjustsFontSizeToFitWidth:NO]; 
// Again set the frame from the height you get from CGRect object. 
[lblMakeModel setFrame:CGRectMake(lblMakeModel.frame.origin.x, lblMakeModel.frame.origin.y, lblMakeModel.frame.size.width, MAX(textRect.size.height, MIN_HEIGHT))]; 
0

本当のバグはまだ方法「boundingRectWithSize」に存在するがあり、時にはそれが限られた幅よりも大きく間違っ幅を与え、私は周りにこの作品でそれを解決し、メソッド「sizeToFit」の後にラベルの高さを取得します

UILabel *textLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0,maxTextWidth, CGFLOAT_MAX)]; 

[textLabel setNumberOfLines:0]; 
[textLabel setFont:Font]; 
[textLabel setLineBreakMode:NSLineBreakByWordWrapping]; 
[textLabel setText:@"Text bla bla bla"]; 
[textLabel sizeToFit]; 
float height = textLabel.frame.size.height; 
関連する問題