2010-04-23 3 views
6

Я знаю, что это одна:Как вычислить высоту текстового прямоугольника из NSString?

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

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

Пример: сделайте UILabel с 320 x 55 точками и поместите там loooooooooooooong текст. Пусть этикетка сократит текст. Сюрприз: CGSize.height остается той же высоты, даже если текст настолько крошечный, что вам нужен микроскоп.

Итак, после того, как я ударил головой о мой macbook pro, который сейчас на полпути сломан, единственное, что может помочь, - это неприятный фактFontSize. Но размер шрифта в pica, я думаю, на самом деле это не то, что вы получаете на экране, не так ли?

Когда размер шрифта равен 10, мой текст на самом деле составляет 10 баллов в максимуме? Время от времени я пробовал именно это, и как только текст имел y или некоторый символ, который простирается ниже (например, этот хвост y), он выходит за границы, и весь текст больше 10 баллов.

Итак, как бы вы вычислили реальную высоту текста для единственной строки uilabel без получения длинной бороды и некоторого больничного опыта?

ответ

2

Похоже, после того, как вы получите фактический размер шрифта из этого вызова функции, вам нужно позвонить еще раз с этим новым размером:

NSString* yourString = @"SomeString"; 
float actualSize; 
[yourString sizeWithFont:yourFont 
      minFontSize:minSize 
      actualFontSize:&actualSize 
       forWidth:rectWidth 
      lineBreakMode:breakMode]; 

CGSize size = [yourString sizeWithFont:[UIFont fontWithName:fontName size:actualSize]]; 
+0

Это работает. Это не самая эффективная вещь на земле, но пока яблоко не зафиксирует свою ошибку (не задерживайте дыхание), она работает. – DougW

3

Попробуйте этот код:

CGSize maximumSize = CGSizeMake(300, 9999); 
NSString *myString = @"This is a long string which wraps"; 
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; 
CGSize myStringSize = [myString sizeWithFont:myFont 
    constrainedToSize:maximumSize 
    lineBreakMode:self.myLabel.lineBreakMode]; 

из моего ответа here

Он использует другой метод, и устанавливает очень высокую CGSize на старте (который затем сократился до строки)

+0

Ну, но я хочу, чтобы текст был нажат, чтобы вписаться в см все прямоугольники ... – dontWatchMyProfile

+0

Пробовал, но он не работает. Когда текст сжимается меткой, высота остается неизменной. Я также попытался обеспечить прямоугольник рамки меток как максимальный размер. – dontWatchMyProfile

+0

Вы установили 'adjustsFontSizeToFitWidth', чтобы предотвратить уменьшение размера шрифта? Или вы хотите уменьшить размер этикетки? –

1

Также вы установили label.numberOfLines = 0;?

+0

нет, но это важно сделать? также, почему 0? разве это не по крайней мере 1 строка? – dontWatchMyProfile

+0

Это свойство устанавливает максимально возможное количество отображаемых строк.1 - значение по умолчанию. 0 означает, что метка не будет ограничивать количество строк. – Skie

3

Важно: С прошивкой 7.0 рекомендуется следующий метод.

sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode:

Используйте приведенный ниже код вместо

CGRect frame = [cellText boundingRectWithSize:CGSizeMake(568,320) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:32.0f]} context:nil]; 
float height = frame.size.height; 
0

После выполнения этого кода frame.size будет иметь высоту и ширину NSString точно ..

NSString *text = @"This is my Mac"; 
textFont = [NSFont fontWithName:@"HelveticaNeue-Medium" size: 80.f]; 
textColor = [NSColor yellowColor]; 
NSDictionary *attribs = @{ NSForegroundColorAttributeName:textColor, 
          NSFontAttributeName: textFont }; 
CGRect frame = [text boundingRectWithSize:CGSizeMake(0,0) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics attributes:attribs context:nil]; 
Смежные вопросы