2011-01-11 2 views
7

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

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

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

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

Simulator Изображения:
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

жестким, верно? Может кто-нибудь помочь? Значок Tumbleweed не был супер забавой, чтобы заработать! – eric

+2

После запуска вашего образца проекта, я считаю, что это был симулятор или ошибка SDK, да, у него нет проблем на Xcode 4 с iOS 4.3. – cxa

+0

Спасибо xan. Теперь он функционирует так, как должен, в текущем Xcode/iOS. – eric

ответ

2

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

enter image description here

+0

Спасибо, что посмотрели на него. Я должен запустить это и посмотреть, все ли это делается в текущей ОС. – eric

+1

Вы правы, это исправлено в новом OS/Xcode. +1 для фактического запуска моего образца против того, чтобы сказать мне, как измерить текст ;-) спасибо Sum! – 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

Интересная идея ... дорогая, как есть ... Мне нужно будет по-новому взглянуть ... через год ... :-) – 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;