Получите динамическую высоту UITextView с автоматической компоновкой после установки текста

У меня UITextView не прокручивается с автоматической компоновкой, заданной конструктором интерфейса, а текст увеличивается или уменьшается динамически без проблем, но я хочу знать, что такое новая высота UITextView после установки текста, я пытаюсь это сделать:

NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
NSLog(@"text after: %.2f",self.myText.frame.size.height);

это результат:

text before: 47.50
text after: 47.50

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

Ответ 1

Это должно работать:

NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
[self.myText layoutIfNeeded]; // <--- Add this
NSLog(@"text after: %.2f",self.myText.frame.size.height);

Вот пример реализации на моем Github: https://github.com/guillaume-algis/SO-27060338

Ответ 2

Все, что вам нужно сделать, это настроить все ваши ограничения, кроме высоты один, и установить для textView scrollEnabled значение NO. Последняя часть - вот что делает трюк. Ваше текстовое представление будет автоматически изменяться в зависимости от его текстового значения.

Ответ 3

Если вы предпочитаете делать все это автоматически:

In Size Inspector:

  1. Установите приоритет сопротивления сжатию содержимого по вертикали до 1000.

  2. Опустите приоритет высоты ограничения для вашего UITextView. Просто сделайте это меньше 1000.

enter image description here

Инспектор атрибутов:

  1. Снимите флажок Включить прокрутку.

Ответ 5

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

Код цели-C

[textView setScrollEnabled:NO];

Быстрый код

textView.isScrollEnabled = false

Ответ 6

Swift 3.0

textView.isScrollEnabled = false

Это позволяет AutoLayout выполнять свою работу.

Ответ 7

Сразу после изменения текстового вызова

[self.myText sizeToFit];

Ответ 8

В отличие от UILabel, UITextView не имеет собственного свойства. Итак, как я это сделал, было настроено ограничение высоты UITextView, подключено через IBOutlet и изменилось его значение в textViewDidChange или при изменении текста.

@IBOutlet weak var textViewHeight: NSLayoutConstraint!

func textViewDidChange(textView: UITextView) {

    // dynamic height adjustments

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal

    if height != textViewHeight.constant { // set when height changed
        textViewHeight.constant = height
        textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
    }
}

Ответ 9

- (void)textViewDidChange:(UITextView *)textView
{
    UIFont *myFont = [UIFont systemFontOfSize:14];
    CGSize size =   [self sizeOfText:textView.text widthOfTextView:TextviewWidth withFont:myFont];
    NSLog(@"Height : %f", size.height);
}

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

Ответ 10

выберите текст и снимите флажок "Прокрутка включена"

выберите textview из верхнего меню "Редактор", размер которого соответствует содержимому "

выберите вид под ним, установите его верхние ограничения в нижней части текста для любого поля, а затем перейдите в "Инспектор размеров", дважды щелкните или отредактируйте только что добавленное ограничение и установите для параметра "Отношение" значение "Больше или равно" "

Ответ 11

Еще один подход заключается в использовании

myTextView.textContainer.heightTracksTextView = true

Это позволяет включить прокрутку

Ответ 12

Ну, я не конвертировал этот код в синтаксис swift4, но логика останется прежней. Это метод расширения для Xamarin.ios (С#).

public static nfloat GetEstimateHeight(this UITextView textView, UIView View)
{
    var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
    var estimatedSize = textView.SizeThatFits(size);
    return estimatedSize.Height;
}

Логика, которая будет работать для Swift

var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
    var estimatedSize = textView.SizeThatFits(size);
    var textViewFinalHeight = estimatedSize.Height;

Ответ 13

Просто дополнение согласно ответу @Pavel Gurov. Если вы уже установили ограничение по высоте, просто сделайте его неактивным. Также стоит позвонить .sizeToFit() после этого, чтобы убедиться, что действие по изменению размера выполнено.

theTextViewHeightConstraint.isActive = false

theTextView.isScrollEnabled = false
theTextView.text = "some text"
theTextView.sizeToFit()