Установка рамки UITextView в размер содержимого больше не работает в Xcode 5

Ниже приведен фрагмент кода для изменения размера кадра UITextView до его высоты содержимого перед установкой Xcode 5, но с момента обновления он не работает:

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

Я искал и не нашел исправления. Любые мысли?

Ответ 1

Там есть новый материал для iOS 7.

Чтобы получить "установленный" размер, используемый текстовым представлением после его обновления, вызовите usedRectForTextContainer: в свойстве textView layoutManager, передав свойство textView textContainer в качестве аргумента.

Слово предупреждения о прокрутке: однако, при изменении размера кадра текстового представления после его обновления текст может иметь неожиданные визуальные ошибки, если прокрутка отключена в вашем текстовом представлении. Если это произойдет, настройте прокрутку перед редактированием текста текстового вида, затем отключите его после его обновления (если вам нужно прокрутить, чтобы он оставался отключенным).

Ответ 2

Чтобы работать в iOS 7 (Xcode 5), просто:

  • Дайте всему пространству возможность получить текст, установив:

    [myTextView setScrollEnabled:YES];

  • Передайте реальный текст:

    myTextView.text = theTextVariable; или myTextView.text = @"The text...";

  • Авторезистировать textView:

    [myTextView sizeToFit];

  • Отключить прокрутку:

    [myTextView setScrollEnabled:NO];

P.S: myTextView может использоваться также как self.myTextView или _myTextView

И получайте удовольствие!

Ответ 3

Я верю, что правильный способ заставить textView обновить его contentSize - это вызвать

[textView layoutIfNeeded]

Однако в iOS 7.0 и 7.1 это, похоже, все еще не работает надежно, если вы не установили

textView.layoutManager.allowsNonContiguousLayout = false;

Мне не ясно, является ли это ошибкой или нет, поскольку я не могу найти хорошее объяснение того, что означает "несмежный макет".

(Мой личный вариант использования программно обновляет textView.text = newValue, а затем пытается соответствующим образом изменить размер textView.)

Ответ 4

[textView sizeToFit];

Это то, что вам нужно.

Все, что вам нужно сделать, это убедиться, что:

[textView setScrollEnabled:YES];

Перед тем, как вы установите текстовое содержимое UITextView.

Вы можете:

[textView sizeToFit];
[textView setScrollEnabled:NO];

После того, как вы установили текст. То же самое, что написать собственную функцию bling или использовать сложные ограничивающие методы rect. Зачем использовать что-то настолько сложное, когда решение так же просто, как три строки?

Итак, оберните эти функции следующим образом:

- (void) setText:(NSString *)theTextToAdd andResizeTheDamnTextView:(UITextView *)textView {
    [textView setScrollEnabled:YES];
    [textView setText:theTextToAdd];
    [textView sizeToFit];
    [textView setScrollEnabled:NO];
}

И определите его в файловой или глобальной базе, чтобы избежать необходимости вручную писать или копировать/вставлять четыре строки и вызывать их каждый раз. Просто назовите его как:

[yourTextViewIvar setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar];

Если это не работает:

[yourTextViewIvar setText:[self setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar]];

И ты будешь золотой.

Я думаю..

Этот псевдокод. Просто FYI.

Ответ 5

Более простым решением является использование:

[textViewExample sizeToFit];    

Эта работа для меня.