sizeWithFont:constrainedToSizeのエッジケースを見つけたと思います。Retinaディスプレイでは、実際に必要な高さよりも1行高く、さらに重要なことに、実際に描画するよりも1行高い高さが返されることがあります(ワードラップに基づいているようです)。 。
注:私が使用している実際のコードは、パフォーマンス中心の手描きの可変高さテーブルビューセルコード内に埋め込まれているため、問題を可能な限り単純なサンプルコードに絞り込みました。(私の質問以外に答えようとするときは、これに注意してください:-)
このサンプルUIViewは、コンテンツを塗りつぶし、収まるようにテキストを測定(折り返し)し、その四角形を塗りつぶしてから、テキストを描画します。
網膜デバイス(またはシミュレーター)では、高さが1行高すぎて返されますが、網膜前デバイス(またはシミュレーター)では、正しい高さが返されます。
それは私が修正したいバグなので、誰かが持っているかもしれない洞察を大いに感謝します!
どうもありがとう!
-エリック
- (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];
}
単純なプロジェクト全体はここから入手できます。
シミュレーター画像: 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