Установка рамки 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];
Эта работа для меня.