Как я должен программно настроить (и каким способом) UILabel, высота которого зависит от его текста? Я пытался настроить его, используя комбинацию раскадровки и кода, но безрезультатно. Каждый рекомендует sizeToFit
при настройке lineBreakMode
и numberOfLines
. Однако, независимо от того , если я ставлю этот код в viewDidLoad:
, viewDidAppear:
или viewDidLayoutSubviews
я не могу получить его на работу. Либо я делаю поле слишком маленьким для длинного текста, и оно не увеличивается, либо я делаю его слишком большим и оно не уменьшается.
ios
ios6
uilabel
autolayout
circuitlego
источник
источник
label.sizeToFit()
в Xcode / viewController, ограничений было достаточно. не создавал лейбл в Playground . До сих пор единственный способ, которым я нашел его для работы на игровой площадке, это делатьlabel.sizeToFit()
Ответы:
Обратите внимание, что в большинстве случаев решение Мэтта работает как положено. Но если это не работает для вас, пожалуйста, читайте дальше.
Чтобы ваша метка автоматически меняла высоту, вам нужно сделать следующее:
Например:
Использование Interface Builder
Установите четыре ограничения. Ограничение по высоте является обязательным.
Затем перейдите в инспектор атрибутов метки и установите количество строк равным 0.
Перейдите в инспектор размера метки и увеличьте вертикальное ContentHuggingPriority и вертикальное ContentCompressionResistancePriority.
Выберите и измените ограничение высоты.
И уменьшить приоритет ограничения высоты.
Наслаждаться. :)
источник
preferredMaxLayoutWidth
либо закрепите ширину этикетки (или ее правую и левую стороны). Вот и все! Затем он будет автоматически расти и сжиматься вертикально, чтобы соответствовать его содержимому.В iOS 6 при использовании автоматического размещения, если стороны UILabel (или ширина) и верх закреплены, он будет автоматически увеличиваться и уменьшаться по вертикали, чтобы соответствовать его содержимому, без какого-либо кода и без нарушения его сопротивления сжатию или чего-либо еще. Это очень просто.
В более сложных случаях просто установите метки
preferredMaxLayoutWidth
.В любом случае, правильная вещь происходит автоматически.
источник
label.sizeToFit()
Хотя вопрос формулируется программно, столкнувшись с той же проблемой и предпочитая работать в Интерфейсном Разработчике, я подумал, что было бы полезно добавить к существующим ответам решение Интерфейсного Разработчика.
Первое, что нужно забыть
sizeToFit
. Auto Layout будет обрабатывать это от вашего имени на основе внутреннего размера контента.Поэтому проблема заключается в том, как сделать так, чтобы метка соответствовала ее содержанию с помощью Auto Layout? В частности - потому что вопрос упоминает это - высота. Обратите внимание, что те же принципы применяются к ширине.
Итак, давайте начнем с примера UILabel, высота которого равна 41px:
Как вы можете видеть на скриншоте выше,
"This is my text"
имеет отступы сверху и снизу. Это отступ между высотой UILabel и его содержанием, текстом.Если мы запустим приложение в симуляторе, то увидим то же самое:
Теперь давайте выберем UILabel в Интерфейсном Разработчике и посмотрим на настройки по умолчанию в Инспекторе размера:
Обратите внимание на выделенное ограничение выше. Это приоритет при доставке контента . Как Эрика Садун описывает это в превосходной демо- версии Auto Layout iOS , это:
Для нас с UILabel основным содержанием является текст.
Вот мы и подошли к сути этого базового сценария. Мы дали нашей текстовой метке два ограничения. Они конфликтуют. Один говорит, что «высота должна быть равна 41 пикселю в высоту» . Другой говорит: «Обними представление о его содержимом, чтобы у нас не было лишних отступов» . В нашем случае обнимите вид текста, чтобы у нас не было лишних отступов.
Теперь, с Auto Layout, с двумя разными инструкциями, которые говорят, делают разные вещи, среда выполнения должна выбирать одну или другую. Это не может сделать оба. UILabel не может иметь высоту 41 пикселя и не иметь отступов.
Способ, которым это решено, является указанием приоритета. Одна инструкция должна иметь более высокий приоритет, чем другая. Если обе инструкции говорят разные вещи и имеют одинаковый приоритет, произойдет исключение.
Итак, давайте попробуем. Мое ограничение по высоте имеет приоритет 1000 , что является обязательным . Высота содержания содержимого составляет 250 , что является слабым . Что произойдет, если мы уменьшим приоритет ограничения высоты до 249 ?
Теперь мы видим, как волшебство начинает происходить. Давайте попробуем в симе:
Потрясающие! Содержание обнимается Только потому, что приоритет 249 высоты меньше, чем приоритет 250 объятия контента . По сути, я говорю: «Высота, которую я здесь указываю, менее важна, чем та, которую я указал для объятия контента» . Итак, контент, обнимающий, побеждает.
Суть в том, чтобы получить метку для соответствия тексту, можно просто указать ограничение по высоте или ширине и исправить этот приоритет в соответствии с ограничением приоритета объятия содержимого этой оси.
Оставим делать эквивалент ширины в качестве упражнения для читателя!
источник
Заметил, что в IOS7 sizeToFit также не работает - возможно, решение может помочь вам
источник
layoutIfNeeded
когда вам нужноsetNeedsUpdateConstraints
. Но ситуация может быть немного другой.Еще одна опция для гарантии того, что метка selectedMaxLayoutWidth синхронизируется с шириной метки:
источник
Я чувствую, что должен внести свой вклад, поскольку мне потребовалось некоторое время, чтобы найти правильное решение:
По сути, происходит то, что вы говорите своей UILabel, что, даже если она имеет фиксированное ограничение высоты, она может нарушить ограничение, чтобы уменьшить себя, чтобы обнять содержимое (например, если у вас есть одна строка), но не может нарушить ограничение, чтобы сделать его больше.
источник
В моем случае я создавал подкласс UIView, который содержал UILabel (неизвестной длины). В iOS7 код был прост: устанавливайте ограничения, не беспокойтесь об объятии контента или сопротивлении сжатию, и все работало, как ожидалось.
Но в iOS6 UILabel всегда была обрезана до одной строки. Ни один из ответов выше не работал для меня. Настройки содержания и сопротивления сжатию игнорировались. Единственное решение, которое предотвратило обрезку, заключалось в том, чтобы на метке было указано предпочтительное значение MaxLayoutWidth. Но я не знал, как установить предпочтительную ширину, так как размер его родительского представления был неизвестен (действительно, это будет определяться содержимым).
Я наконец нашел решение здесь . Поскольку я работал над пользовательским представлением, я мог просто добавить следующий метод, чтобы установить предпочтительную ширину макета после того, как ограничения были рассчитаны один раз, а затем пересчитать их:
источник
Я добавил
UILabel
программно, и в моем случае этого было достаточно:источник
Я решил с помощью xCode6 поставить «Предпочитаемую ширину» в режим «Автоматически» и закрепить верхнюю, верхнюю и конечную метки
источник
источник
Я столкнулся с этой проблемой также с подклассом UIView, который содержит UILabel как единое целое, если его внутренние элементы. Даже с автоматической разметкой и пробой всех рекомендуемых решений, ярлык просто не будет сужаться по высоте до текста. В моем случае я хочу, чтобы лейбл был только одной строкой.
Во всяком случае, для меня сработало добавление требуемого ограничения высоты для UILabel и установка его вручную на правильную высоту при вызове intrinsicContentSize. Если у вас нет UILabel, содержащегося в другом UIView, вы можете попробовать создать подкласс UILabel и предоставить аналогичную реализацию, сначала установив ограничение высоты, а затем вернув
[super instrinsicContentSize]; вместо [self.containerview intrinsiceContentSize]; как я делаю ниже, что специфично для моего подкласса UIView.
Отлично работает сейчас на iOS 7 и iOS 8.
источник
intrinsicContentSize
. Среда выполнения должна быть в состоянии рассчитать это на основе ваших правильно установленных ограничений.Решение, которое сработало для меня; Если ваша UILabel имеет фиксированную ширину, измените ограничение с
constant =
наconstant <=
в вашем файле интерфейсаисточник
В моем случае при использовании меток в UITableViewCell метка at изменится, но высота превысит высоту ячейки таблицы. Это то, что сработало для меня. Я сделал в соответствии с Максом Маклаудом, а затем убедился, что высота ячейки была установлена на UITableViewAutomaticDimension.
Вы можете добавить это в вашем init или awakeFromNib,
В раскадровке выберите ячейку, откройте инспектор размера и убедитесь, что для высоты строки установлено значение «По умолчанию», сняв флажок «Пользовательский».
В 8.0 есть проблема, которая также требует, чтобы это было установлено в коде.
источник