NSString sizeWithFont: constrainedToSize: возврат неправильной высоты на дисплеях сетчатки

Я думаю, что нашел краевой случай для sizeWithFont: constrainedToSize: где на экране сетчатки иногда он (по-видимому, основан на переносе слов) возвращает высоту на 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

3 ответа

Кажется, проблема с вашим симулятором. Это то, что я получил, когда я запустил его с помощью симулятора Retina на OS 4.3.2.


Ниже приведен метод, который я использую для определения высоты метки для динамического текстового содержимого. Это отлично работает в моем приложении

- (float) getHeightFortheDynamicLabel: (NSString *) stringForTheLabel
{   UITextView * aSampleTextView;   // 30 - минимальная высота   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; 
}


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;

licensed under cc by-sa 3.0 with attribution.