2011-01-11 25 views
7

私はsizeWithFontの端のケースを見つけたと思います:constrainedToSize:網膜ディスプレイ上で、時には(ワードラッピングに基づいているようです)実際に必要とされるよりも背が高く、より重要なのはそれが実際に描くものよりも大きい。NSString sizeWithFont:constrainedToSize:網膜ディスプレイ上の不正確な高さを返す

注:私が使用している実際のコードは、パフォーマンス中心の手書き可変高さテーブルビューのセルコード内に埋め込まれています。そのため、問題を可能な限りシンプルなものにしています。 (私の質問以外に何かをしようとするときに注意してください:-)

このサンプルのUIViewは内容を塗りつぶし、適切なテキストを測定(折り返し)し、その矩形を塗りつぶしてからテキストを描画します。

網膜デバイス(またはシミュレータ)では、高さが1ラインも高すぎますが、網膜前デバイス(またはシミュレータ)では正しい高さを返します。

私は修正したいバグですので、誰もが知っていることを大変感謝しています!

大変ありがとうございます!

-eric

- (void)drawRect:(CGRect)rect { 
NSString * theString = @"Lorem ipsum dolor sit ameyyet, consectetur adipiscing elit. Etiam vel justo leo. Curabitur porta, elit vel."; 
UIFont * theFont = [UIFont systemFontOfSize:12]; 
CGSize theConstraint = CGSizeMake(rect.size.width - 20, rect.size.height - 20); 
CGSize theResultSize = [theString sizeWithFont:theFont constrainedToSize:theConstraint]; 

// dump the measurements 
NSLog(@"returned a size h = %f, w = %f", theResultSize.height, theResultSize.width); 

// fill the whole rect 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[[UIColor yellowColor] set]; 
CGContextFillRect(context, rect); 

// fill the measured rect 
CGRect theRect = CGRectMake(10, 10, theResultSize.width, theResultSize.height); 
context = UIGraphicsGetCurrentContext(); 
[[UIColor cyanColor] set]; 
CGContextFillRect(context, theRect); 

// draw the text 
[[UIColor blackColor] set]; 
[theString drawInRect:theRect withFont:theFont]; 
} 

全体単純なプロジェクトはhere可能です。

シミュレータ画像:
http://files.droplr.com/files/9979822/aLDJ.Screen%20shot%202011-01-11%20at%2012%3A34%3A34.png http://files.droplr.com/files/9979822/YpCM.Screen%20shot%202011-01-11%20at%2012%3A36%3A47.png

+0

タフ1を、それを実行したときに、私が得たものでしょうか?助けてもらえますか? Tumbleweedのバッジは、獲得する超楽しさではありませんでした! – eric

+2

サンプルプロジェクトを実行した後、シミュレータまたはSDKのバグだと思います。はい、iOS 4.3のXcode 4では問題ありません。 – cxa

+0

ありがとうございました。それは現在のXcode/iOSのように機能しています – eric

答えて

2

で正常に動作します。これは私が右、OS上のRetinaシミュレータで4.3.2

enter image description here

+0

それを見ていただきありがとうございます。これを起動して、それが現在のOSでそれをやっているかどうかを確認する必要があります。 – eric

+1

あなたは正しいです、それは新しいOS/Xcodeで修正されています。 +1実際に私のサンプルを実行しているの対私はテキストを測定する方法を教えて;-)おかげで合計! – eric

+0

まあ、私はちょうどiOS8でこの同じバグを見せてしまった...もう一度それに注意を払う時間。今回は、デバイス上で起こっている! – eric

1

後は、私は、ダイナミックテキストコンテンツのラベルの高さを見つけるために使用する方法です。これは私のアプリあなたのシミュレータの問題であるように思わ

 
 
- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel 
{ 
    UITextView *aSampleTextView; 
    // 30 is the minimum height 
    aSampleTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, mywidth, 30)]; 
    aSampleTextView.text = stringForTheLabel; 
    aSampleTextView.font = [UIFont systemFontOfSize:kMyFontSize]; 
    aSampleTextView.alpha = 0; 
    [self.view addSubview:aSampleTextView]; 
    float textViewHeight = aSampleTextView.contentSize.height; 
    [aSampleTextView removeFromSuperview]; 
    [aSampleTextView release]; 
    return textViewHeight;
}

+0

興味深いアイデア...それなりに高価...私は新鮮な外観を取る必要があります... 1年後:...-) – eric

+0

このメソッドを使用する前に、私は試しました(CGSize theResultSize = [theString sizeWithFont :theFont constrainedToSize:theConstraint]; )それほど正確ではありませんでした(なぜわかりません)。この方法はメモリ使用量はほとんどありませんが、私にとってはうまく動作します。 –

0
 NSString *strSubstring = @"asdfghjklasdfghjkl adsds"; 

     CGFloat maxWidth = 205.0; 
     CGFloat maxHeight = 9999; 
     CGSize maximumLabelSize = CGSizeMake(maxWidth,maxHeight); 
     CGSize expectedLabelSize = [strSubstring sizeWithFont:[UIFont fontWithName:@"StagSans-Light" size:12] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; 

     NSLog(@"returned a size h = %f, w = %f", expectedLabelSize.height, expectedLabelSize.width); 

     return expectedLabelSize; 
関連する問題