NSString sizeWithFont: constrainedToSize: возвращает неправильную высоту на дисплеях сетчатки - PullRequest
7 голосов
/ 11 января 2011

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

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

Этот образец 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];
}

Весь простой проект доступен здесь .

Симулятор Изображения:
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 ]

2 голосов
/ 02 декабря 2011

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

enter image description here

1 голос
/ 02 декабря 2011

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


- (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 голосов
/ 19 марта 2012
        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;
...