2011-02-05 2 views
13

Есть ли эквивалент метода NSString sizeWithFont:, который может использоваться для расчета высоты текста в UITectView для заданной ширины? Все методы из NSString работают только на одной строке, что я могу сказать.NSString sizeWithFont: для нескольких строк?

ответ

33

От Apple's reference для этих методов NSString вы можете использовать -sizeWithFont:constrainedToSize: или -sizeWithFont:constrainedToSize:lineBreakMode: для «Вычисления показателей для нескольких строк текста».

CGSize size = [theString sizeWithFont:font 
        constrainedToSize:CGSizeMake(width, 100000)]; 
return size.height; 
+0

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

+13

Кажется, это возвращает значение 1-2 строк слишком мало. Любая идея почему? – Jumhyn

+0

@Jumhyn: попробуйте метод '-drawInRect:', чтобы вывести строку, чтобы проверить, не обертывается ли она в нужном месте. – kennytm

4

Для UITextView, все, что вам нужно сделать, это вызов -sizeToFit на взгляд, и он будет автоматически изменять его высоту, пока он не может поместиться весь текст доступен. Все, что вам нужно сделать, это установить ширину текстового вида, установить текст, затем вызвать -sizeToFit. Текстовое представление изменит его высоту настолько, чтобы соответствовать всему тексту.

UPDATE:

Видимо TEXT вид сжиматься только тогда, когда есть избыток высоты, но они не растут, если есть недостаточная высота для отображения всего текста. Кроме того, как только вы вызываете -sizeToFit, координата текстового вида y сбрасывается обратно до 0.0f. Итак, вот что вы делаете:

CGFloat textViewWidth = 300.0f; 
CGFloat textViewPadding = 10.0f; 

UITextView * textView = [[[UITextView alloc] init] autorelease]; 
textView.text = ...; // Really long string 
textView.frame = CGRectMake(0.0f, 0.0f, textViewWidth, CGFLOAT_MAX); 

[textView sizeToFit]; // Shrinks the height to fit all the text 

textView.frame = CGRectMake(textViewPadding, textViewPadding, 
    textViewWidth, textView.frame.size.height); 

[self.view addSubview:textView]; 

Сначала вы устанавливаете рамку только для того, чтобы вы могли установить ширину так, как хотите. Вы используете CGFLOAT_MAX, чтобы в значительной степени указать бесконечную высоту. Затем вызов -sizeToFit сжимает высоту до тех пор, пока она не будет полностью соответствовать всему тексту. Тем не менее, он также сбрасывает y координат, поэтому мы идем вперед и установить рамку снова настроить x и y координат, в данном примере, 10.0f как для x и y -, оставляя ширину в покое и сохранить высоту установки на любой -sizeToFit рассчитывается.

+0

Кажется ничего не меняет. – Jumhyn

+0

Я выяснил, как работает UITextView. Выполнение чего-то вроде кода образца, который я добавил, должно привести к текстовому представлению, которое достаточно высоко, чтобы соответствовать всему тексту. – LucasTizma

+0

CGFLOAT_MAX вызвал некоторые напуганные размытия/разрывы на iPhone 5.1, когда UITextView ушел в отставку с первого ответчика, а UITableView прокручивается назад. Меньшее число, например 1024.0f (длинная сторона iPad), исправило это для меня. –

1

Фактически, вы можете использовать свойство contentSize.