NSString sizeWithFont: constrainedToSize: возвращает неверную высоту на дисплеях Retina

Я думаю, что нашел крайний случай для sizeWithFont: constrainedToSize: где на дисплее сетчатки он иногда (кажется, на основе переноса слов) возвращает высоту на 1 строку выше, чем это действительно необходимо, и, что более важно, чем она на самом деле рисует .

ПРИМЕЧАНИЕ. Настоящий код, который я использую, похоронен внутри кода ячейки представления таблицы переменной высоты, ориентированного на производительность, поэтому я решил проблему до как можно более простого фрагмента кода примера. (Пожалуйста, обратите внимание на это, когда пытаетесь ответить на что-то, кроме моего вопроса :-)

Этот образец UIView заполняет его содержимое, измеряет текст, чтобы он поместился (обернутый), заполняет этот прямоугольник, а затем рисует текст.

На устройстве Retina (или симуляторе) высота возвращается на 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


person eric    schedule 11.01.2011    source источник
comment
Трудный, правда? Кто-нибудь может помочь? Значок Tumbleweed было не очень весело заработать!   -  person eric    schedule 20.01.2011
comment
После запуска вашего демонстрационного проекта я считаю, что это была ошибка симулятора или SDK, да, в Xcode 4 с iOS 4.3 проблем нет.   -  person cxa    schedule 25.05.2011
comment
Спасибо, xan. Теперь он работает так, как должен, в текущем Xcode / iOS.   -  person eric    schedule 04.04.2012
comment
Что ж ... У меня только что та же самая ошибка проявилась в iOS8 ... Пора снова обратить на нее внимание. На этот раз это происходит НА УСТРОЙСТВЕ !!   -  person eric    schedule 14.04.2015


Ответы (2)


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

введите описание изображения здесь

person Sum    schedule 02.12.2011
comment
Спасибо, что посмотрели на это. Мне нужно запустить это и посмотреть, продолжает ли он это делать в текущей (ых) ОС (ах). - person eric; 13.12.2011
comment
Вы правы, это исправлено в новой OS / Xcode. +1 за то, что я проверил образец вместо того, чтобы сказать мне, как измерить текст ;-) спасибо Sum! - person eric; 04.04.2012
comment
Что ж ... У меня только что та же самая ошибка проявилась в iOS8 ... Пора снова обратить на нее внимание. На этот раз это происходит НА УСТРОЙСТВЕ !! - person eric; 14.04.2015

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


- (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;
}

person Adarsh V C    schedule 02.12.2011
comment
Интересная идея ... как бы дорого ... Придется по-новому взглянуть ... через год ... :-) - person eric; 13.12.2011
comment
Перед тем, как использовать этот метод, я просто попробовал (CGSize theResultSize = [theString sizeWithFont: theFont constrainedToSize: theConstraint];) Но это было не так точно (я не знаю почему). Несмотря на то, что этот метод потребляет мало памяти и т. Д., Он отлично работает для меня. - person Adarsh V C; 14.12.2011