Хотя вопрос формулируется программно, столкнувшись с той же проблемой и предпочитая работать в Интерфейсном Разработчике, я подумал, что было бы полезно добавить к существующим ответам решение Интерфейсного Разработчика.
Первое, что нужно забыть 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 объятия контента . По сути, я говорю: «Высота, которую я здесь указываю, менее важна, чем та, которую я указал для объятия контента» . Итак, контент, обнимающий, побеждает.
Суть в том, чтобы получить метку для соответствия тексту, можно просто указать ограничение по высоте или ширине и исправить этот приоритет в соответствии с ограничением приоритета объятия содержимого этой оси.
Оставим делать эквивалент ширины в качестве упражнения для читателя!
label.sizeToFit()
в Xcode / viewController, ограничений было достаточно. не создавал лейбл в Playground . До сих пор единственный способ, которым я нашел его для работы на игровой площадке, это делатьlabel.sizeToFit()