Есть ли хороший способ настроить размер, UITextView
чтобы соответствовать его содержанию? Скажем, например, у меня есть, UITextView
который содержит одну строку текста:
"Hello world"
Затем я добавляю еще одну строку текста:
"Goodbye world"
Есть ли хороший способ в Cocoa Touch, чтобы получить тот, rect
который будет содержать все строки в текстовом представлении, чтобы я мог соответствующим образом настроить родительский вид?
В качестве другого примера посмотрите на поле заметок для событий в приложении «Календарь» - обратите внимание, как ячейка (и UITextView
содержащаяся в ней) расширяется, чтобы содержать все строки текста в строке заметок.
Ответы:
Это работает как для iOS 6.1, так и для iOS 7:
Или в Swift (Работает с Swift 4.1 в iOS 11)
Если вам нужна поддержка iOS 6.1, вам также следует:
источник
textview.scrollEnabled = NO;
было предотвратить обрезание текста даже в iOS 7.CGFLOAT_MAX
макрос вместоMAXFLOAT
. Правильно для обеих 32/64 битных платформ.Это больше не работает на iOS 7 или выше
На самом деле существует очень простой способ изменить размер
UITextView
содержимого до его правильной высоты. Это можно сделать с помощьюUITextView
contentSize
.Одна вещь , чтобы отметить , что правильный
contentSize
доступен только послеUITextView
того, как была добавлена к просмотру сaddSubview
. До этого он равенframe.size
Это не будет работать, если включена автоматическая разметка. При автоматической компоновке общий подход заключается в использовании
sizeThatFits
метода и обновленииconstant
значения ограничения высоты.heightConstraint
это ограничение макета, которое вы обычно устанавливаете с помощью IBOutlet, связывая свойство с ограничением высоты, созданным в раскадровке.Просто добавьте к этому удивительному ответу 2014, если вы:
есть разница в поведении только с iPhone6 + :
Только с 6+ (не с 5 или 6) он добавляет «еще одну пустую строку» в UITextView. «Решение RL» прекрасно это исправляет:
Исправляет проблему «лишней линии» на 6+.
источник
layoutIfNeeded
к суперпредставлению. Тогда вы можете получить высоту отcontentSize
.Для динамического определения размера
UITextView
внутриUITableViewCell
я обнаружил, что следующая комбинация работает в Xcode 6 с iOS 8 SDK:UITextView
кUITableViewCell
и ограничьте его по сторонамUITextView
' . При включенной прокрутке кадр не зависит от размера его содержимого, но при отключенной прокрутке между ними существует связь.scrollEnabled
NO
UITextView
Если ваша таблица использует исходную высоту строки по умолчанию, равную 44, тогда она автоматически вычислит высоту строки, но если вы изменили высоту строки по умолчанию на что-то другое, вам может потребоваться вручную включить автоматический расчет высоты строки в
viewDidLoad
:Для динамического определения размера только для чтения
UITextView
, вот и все. Если вы разрешаете пользователям редактировать текст в вашемUITextView
, вам также необходимо:Реализуйте
textViewDidChange:
методUITextViewDelegate
протокола и попроситеtableView
перерисовывать себя каждый раз, когда текст редактируется:И не забудьте установить
UITextView
делегата где-нибудь, вStoryboard
или вtableView:cellForRowAtIndexPath:
источник
tableView.rowHeight = UITableViewAutomaticDimension
было ненужным.Очень простое в использовании решение с использованием кода и раскадровки.
По коду
По раскадровке
Снимите флажок Включить прокрутку
Не нужно ничего делать кроме этого.
источник
Свифт:
источник
textView.scrollEnabled = false
По моему (ограниченному) опыту,
не учитывает символы новой строки, поэтому вы можете получить намного короче,
CGSize
чем требуется на самом деле.похоже, уважает новые строки.
Кроме того, текст на самом деле не отображается в верхней части
UITextView
. В моем коде я установил новую высоту наUITextView
24 пикселя больше, чем высота, возвращаемаяsizeOfFont
методами.источник
В iOS6 вы можете проверить
contentSize
свойство UITextView сразу после установки текста. В iOS7 это больше не будет работать. Если вы хотите восстановить это поведение для iOS7, поместите следующий код в подкласс UITextView.источник
Я опубликую правильное решение в нижней части страницы на тот случай, если кто-то проявит смелость (или достаточно отчаялся), чтобы прочитать эту статью.
Вот репозиторий gitHub для тех, кто не хочет читать весь этот текст: resizableTextView
Это работает с iOs7 (и я верю, что это будет работать с iOs8) и с autolayout. Вам не нужны магические числа, отключить макет и тому подобное. Краткое и элегантное решение.
Я думаю, что весь код, связанный с ограничениями, должен идти в
updateConstraints
метод. Итак, давайте сделаем наши собственныеResizableTextView
.Первая проблема, с которой мы здесь сталкиваемся, заключается в том, что мы не знаем реального размера контента перед
viewDidLoad
методом. Мы можем взять длинный и ошибочный путь и рассчитать его на основе размера шрифта, разрывов строк и т. Д. Но нам нужно надежное решение, поэтому мы сделаем:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Так что теперь мы знаем реальный размер контента независимо от того, где мы находимся: до или после
viewDidLoad
. Теперь добавьте ограничение высоты для textView (через раскадровку или код, независимо от того, как). Мы скорректируем это значение с помощью нашегоcontentSize.height
:Последнее, что нужно сделать, это сказать суперклассу
updateConstraints
.Теперь наш класс выглядит так:
ResizableTextView.m
Красиво и чисто, правда? И вам не нужно иметь дело с этим кодом в ваших контроллерах !
Но ждать! У НЕТ АНИМАЦИИ!
Вы можете легко анимировать изменения, чтобы
textView
плавно растягиваться. Вот пример:источник
CGFLOAT_MAX
, нетFLT_MAX
.Ты пробовал
[textView sizeThatFits:textView.bounds]
?Редактировать: sizeThatFits возвращает размер, но фактически не изменяет размер компонента. Я не уверен, что это то, что вы хотите, или если
[textView sizeToFit]
это больше, что вы искали. В любом случае, я не знаю, будет ли он идеально соответствовать контенту, который вы хотите, но это первое, что нужно попробовать.источник
Другой метод - это поиск размера, который определенная строка займет, используя
NSString
метод:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
Это возвращает размер прямоугольника, который соответствует данной строке с данным шрифтом. Передайте размер с желаемой шириной и максимальной высотой, а затем вы можете посмотреть на высоту, возвращаемую в соответствии с текстом. Существует версия, которая позволяет также указать режим разрыва строки.
Затем вы можете использовать возвращенный размер, чтобы изменить размер вашего представления, чтобы соответствовать.
источник
Если у вас нет
UITextView
удобного устройства (например, вы измеряете ячейки табличного представления), вам придется рассчитать размер, измерив строку, а затем с учетом 8 пт отступов на каждой стороне aUITextView
. Например, если вы знаете желаемую ширину вашего текстового представления и хотите определить соответствующую высоту:Здесь каждая 8 учитывает один из четырех заполненных краев, а 100000 служит очень большим максимальным размером.
На практике вы можете добавить дополнительный
font.leading
к высоте; это добавляет пустую строку ниже вашего текста, которая может выглядеть лучше, если есть визуально тяжелые элементы управления непосредственно под текстовым представлением.источник
Мы можем сделать это с помощью ограничений.
2. Создайте IBOutlet для этого ограничения высоты.
3. не забудьте установить делегат для вашего textview.
4.
тогда обновите свое ограничение как это :)
источник
Достаточно следующих вещей:
UITextView
:Вы можете даже использовать
UITableViewAutomaticDimension
.источник
В сочетании с ответом Майка МакМастера вы можете сделать что-то вроде:
источник
Я нашел способ изменить высоту текстового поля в соответствии с текстом внутри него, а также расположить метку под ним в зависимости от высоты текстового поля! Вот код
источник
Ребята, использующие autolayout, и ваш sizetofit не работает, тогда, пожалуйста, проверьте ограничение ширины один раз. Если вы пропустили ограничение ширины, высота будет точной.
Нет необходимости использовать любой другой API. только одна строка решит все проблемы.
Здесь я интересовался только высотой, сохраняя фиксированную ширину и пропустив ограничение ширины моего TextView в раскадровке.
И это должно было показать динамический контент от сервисов.
Надеюсь, что это может помочь ..
источник
Начиная с iOS 8, можно использовать функции автоматического макета UITableView для автоматического изменения размера UITextView без какого-либо пользовательского кода вообще. Я поместил проект в github, который демонстрирует это в действии, но вот ключ:
rowHeight
вUITableViewAutomaticDimension
.источник
Я просмотрел все ответы и все держал фиксированную ширину и корректировал только высоту. Если вы хотите отрегулировать также ширину, вы можете очень легко использовать этот метод:
поэтому при настройке текстового представления отключите прокрутку
и затем в методе делегата
func textViewDidChange(_ textView: UITextView)
добавьте этот код:Выходы:
источник
Это хорошо работало, когда мне нужно было сделать текст
UITextView
вписывающимся в определенную область:источник
вот быстрая версия @jhibberd
источник
отключить прокрутку
добавить содержание
и добавьте свой текст
если вы используете,
UIScrollView
вы должны добавить это тоже;источник
Для iOS 7.0 вместо установки
frame.size.height
наcontentSize.height
(который в настоящее время ничего не делает) использовать[textView sizeToFit]
.Смотрите этот вопрос .
источник
Использование UITextViewDelegate - самый простой способ:
источник
Надеюсь это поможет:
источник
textView.frame
.если кто-нибудь еще доберется до меня, это решение будет работать для меня, 1 «Ронни Лью» +4 «user63934» (мой текст приходит из веб-службы): обратите внимание на 1000 (ничто не может быть таким большим «в моем случае»)
И это ... Ура
источник
Лучший способ, который я обнаружил, - изменить размер UITextView в соответствии с размером текста.
или вы можете использовать
источник
Для тех, кто хочет, чтобы текстовый вид действительно двигался вверх и поддерживал позицию нижней строки
источник
Единственный работающий код - это тот, который использует «SizeToFit», как в ответе jhibberd выше, но на самом деле он не подхватит, если вы не вызовете его в ViewDidAppear или не подключите его к событию изменения текста UITextView.
источник
Основываясь на ответе Никиты Тука, я пришел к следующему решению в Swift, которое работает на iOS 8 с autolayout:
источник
Быстрый ответ: следующий код вычисляет высоту вашего textView.
Теперь вы можете установить высоту вашего textView в
myTextHeight
источник
let attribute = [NSFontAttributeName: textView.text.font!]
действительно ли это код Swift без ошибок?) Выlet attribute = [NSFontAttributeName: textView.font!]