Хоча питання задається програмно, зіткнувшись з тією ж проблемою і вважаючи за краще працювати в Interface Builder, я подумав, що може бути корисним доповнити існуючі відповіді рішенням Interface Builder.
Перше, що потрібно забути sizeToFit
. Автоматичний макет буде вирішувати це від вашого імені залежно від внутрішнього розміру вмісту.
Тому проблема полягає в тому, як отримати етикетку, яка відповідає її вмісту за допомогою автоматичного макета? Конкретніше - тому що в цьому питанні згадується - висота. Зауважте, що ті самі принципи застосовуються і до ширини.
Отже, почнемо з прикладу UILabel, висота якого встановлена у висоту 41 пікселів:
Як ви бачите на захопленні екрана вгорі, "This is my text"
має підкладки зверху і знизу. Це прокладка між висотою UILabel, і це вміст, текст.
Якщо ми запускаємо додаток у тренажері, то, звичайно, ми бачимо те саме:
Тепер виберемо UILabel в Interface Builder і подивимось параметри за замовчуванням в інспекторі розмірів:
Зверніть увагу на виділене вище обмеження. Це пріоритет наповнення змісту . Оскільки Еріка Садун описує це у чудовому автоматичному макеті iOS, демістифікованому , це:
спосіб перегляду воліє уникати зайвих оббивок навколо його основного вмісту
Для нас, з UILabel, основним змістом є текст.
Ось ми і в основі цього основного сценарію. Ми надали нашій текстовій мітці два обмеження. Вони конфліктують. Один каже, що "висота повинна бути дорівнює 41 пікселям" . Інший каже: "обійняти погляд на його вміст, щоб у нас не було зайвих накладок" . У нашому випадку обійміть погляд на текст, щоб у нас не було зайвих накладок.
Тепер, з автоматичним макетом, з двома різними інструкціями, які говорять робити різні речі, час виконання повинен вибрати одну чи іншу. Це не може зробити і те, і інше. Висота UILabel не може бути високою як 41 піксель, так і не має прокладок.
Спосіб вирішення цього питання полягає у визначенні пріоритету. Одна інструкція повинна мати більш високий пріоритет, ніж інша. Якщо обидві інструкції говорять про різні речі та мають однаковий пріоритет, станеться виняток.
Тож давайте давай. Моє обмеження висоти має пріоритет 1000 , який необхідний . Висота вмісту обіймів - 250 , що є слабким . Що станеться, якщо зменшити пріоритет обмеження висоти до 249 ?
Тепер ми можемо побачити, що магія починає відбуватися. Спробуємо в сім:
Дивовижно! Досягнуте змісту обіймання. Тільки тому, що пріоритет висоти 249 менший, ніж пріоритет 250, який охоплює вміст . В основному я кажу, що "висота, яку я тут вказую, менш важлива, ніж те, що я вказав для обіймів вмісту" . Отже, зміст обіймів виграє.
Підсумок, отримання ярлика для відповідності тексту може бути таким же простим, як і встановлення обмеження по висоті чи ширині, і виправити встановлення цього пріоритету в поєднанні з обмеженням пріоритету змісту цього осі.
Залишимо робити еквівалент по ширині як вправу для читача!
label.sizeToFit()
в Xcode / viewController, обмежень було достатньо. не створили етикетку на Playground . Поки єдиний спосіб, коли я виявив, що це працює на Playground, це зробитиlabel.sizeToFit()