NSString sizeWithFont: для нескольких строк?

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

Ответы

Ответ 1

В ссылка Apple для этих методов NSString вы можете использовать -sizeWithFont:constrainedToSize: или -sizeWithFont:constrainedToSize:lineBreakMode: для "Вычисления метрик для нескольких строк текста".

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

Ответ 2

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

UPDATE:

По-видимому, текстовые представления уменьшаются только при избыточной высоте, но они не растут, если имеется недостаточная высота для отображения всего текста. Кроме того, после вызова -sizeToFit координата текстового представления y reset возвращается к 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.

Ответ 3

На самом деле вы можете использовать свойство contentSize.