не могу получить высоту uitextview динамически правильно - PullRequest
9 голосов
/ 12 апреля 2011

У меня проблема с получением правильного размера uitextview. В моем приложении я получаю данные из веб-сервиса и устанавливаю высоту uitextview в соответствии с данными из веб-сервиса. Но всякий раз, когда в первых 35 буквах есть место (рамка из моего textview (20,0,255,2000)). тогда вычисленный hjeight всегда на одну строку меньше правильной высоты, и даже представление uitext начинает печатать строку после пробела в новой строке (возможно, слово большое, поэтому ??).

Итак, я получаю неправильную высоту просмотра текста.

Текстовое представление выглядит так:

firstword spacesspacesspacesspaces spacesspacesspacesspaces spacesspacesspacesspaces spacesspacesspacesspaces spacesspacesspacesspaces

Когда я ввожу текст, который, скажем, без пробелов, он дает мне правильную высоту, предположим, что данные «ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt» Тогда в вышеупомянутом scenerio Cgsize сгенерирует правильный результат для меня.

Здесь я не использую UILabel, потому что я хочу обнаружение ссылок, вот почему. Если у кого-то есть другие предложения, это очень приветствуется.

С уважением Mrugen

Ответы [ 6 ]

33 голосов
/ 13 апреля 2011

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

UITextView - это подкласс UIScrollView.После того как вы установите свойство text для textview, его свойство contentSize автоматически обновится, чтобы соответствовать тексту.Итак, если вы хотите установить высоту текстового представления, чтобы оно соответствовало тексту, просто сделайте:

textView.text    = @"some text";
CGRect rect      = textView.frame;
rect.size.height = textView.contentSize.height;
textView.frame   = rect;

Это установит высоту вашего textView, чтобы он содержал текст.

9 голосов
/ 12 апреля 2011

С помощью этой функции вы можете измерить высоту текста и установить рамку в соответствии с возвращаемой высотой.

   -(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font
    {
        CGSize ts = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap];
        return ts; 
    }

вы используете это так:

 CGSize size =   [self sizeOfText:@"the string you want to present" widthOfTextView:255 withFont:fontYouAreUsing];

И затем вы передаете его в текстовое представление:

   textView.frame = CGRectMake(20,0,255,size.height);

Удачи

Шани

1 голос
/ 05 марта 2015

Начиная с iOS7, теперь вы должны использовать:

CGRect textRect = [textToMesure boundingRectWithSize:CGSizeMake(width, FLT_MAX)
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:@{NSFontAttributeName:font}
                                     context:nil];

CGSize size = textRect.size;
0 голосов
/ 09 декабря 2018

Пробовал в Swift 4,

textView.intrinsicContentSize.height

0 голосов
/ 04 февраля 2018

Получите оценочные значения Height и Width для любого textField: (Swift 4)

Он принимает текст TextField в качестве аргумента.

private func estimateFrameForText(text: String) -> CGRect {

        let size = CGSize(width: 200.0, height: 1000)

        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)

        return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17.0)], context: nil)
    }
0 голосов
/ 27 мая 2013

Ответ на ваш вопрос Создайте экземпляр для UITextView. В моем случае я создал txtView, а затем добавил к нему текст и распечатал высоту содержимого в консоли.

NSLog (@ "Высота TextView равна:% d", txtView.contentSize.height)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...