Ви натрапляєте на побічний ефект фантастичної нової функції в табличних оглядах iOS8: Автоматична висота рядків.
У iOS 7 у вас були або рядки фіксованого розміру (встановлені з tableView.rowHeight
), або ви писали код, щоб обчислити висоту своїх комірок, і ви повернете це вtableView:heightForRowAtIndexPath
. Написання коду для обчислення висоти комірки може бути досить складним, якби у вашій комірці було багато переглядів і ви мали різну висоту, яку слід врахувати при різних розмірах шрифту. Додайте в Dynamic Type і процес був біль в попці.
В iOS 8 ви все ще можете зробити вищезазначене, але тепер висоту рядків можна визначити iOS за умови, що ви налаштували вміст своєї комірки за допомогою функції автоматичної компонування. Це величезна вигода для розробників, тому що, коли динамічний розмір шрифту змінюється або користувач змінює розмір тексту за допомогою Налаштувань доступності, ваш інтерфейс може бути адаптованим до нового розміру. Це також означає, що якщо у вас є UILabel, який може мати декілька рядків тексту, ваша клітинка тепер може зростати, щоб вмістити ті, коли потрібно клітинкам, і скорочуватися, коли цього немає, тому немає зайвого пробілу.
Попереджувальне повідомлення, яке ви бачите, говорить про те, що у вашій комірці недостатньо обмежень для автоматичної компонування, щоб повідомити табличний перегляд висоти комірки.
Щоб використовувати динамічну висоту комірки, яка, поряд із технікою, вже згаданою іншими плакатами, також позбавиться від цього повідомлення, вам потрібно забезпечити, щоб у вашій комірці було достатньо обмежень для прив’язки елементів інтерфейсу до верху та внизу комірки. Якщо ви раніше використовували автоматичний макет, ви, мабуть, звикли встановлювати обмеження Top + Leading, але динамічна висота рядка також вимагає обмеження внизу.
Пропуск макета працює таким чином, який відбувається безпосередньо перед відображенням комірки на екрані, точно вчасно:
Розміри для вмісту із властивими розмірами розраховуються. Сюди входять UILabels та UIImageViews, де їх розміри залежать відповідно від тексту або UIImages, які вони містять. Обидва ці представлення вважатимуть їх ширину відомою (тому що ви встановили обмеження для останнього / переднього краю, або ви встановили явні ширини, або ви використовували горизонтальні обмеження, які з часом виявляють ширину з боку в бік). Скажімо, на етикетці є абзац тексту ("кількість рядків" встановлено на 0, тому він автоматично обертається), він може становити лише 310 балів, тому він визначає висоту 120pt при поточному розмірі шрифту.
Користувальницький інтерфейс викладається відповідно до ваших обмежень щодо позиціонування. Внизу мітки є обмеження, яке з'єднується з нижньою полем комірки. Оскільки мітка зросла до 120 точок у висоту, і оскільки вона обмежена нижньою частиною комірки, вона повинна штовхати клітинку "вниз" (збільшуючи висоту комірки), щоб задовольнити обмеження, яке говорить "внизу мітка - це завжди стандартна відстань від нижньої частини комірки.
Повідомлення про помилку, про яке ви повідомляли, виникає, якщо цього нижнього обмеження відсутнє, і в цьому випадку нічого не можна «відштовхувати» від нижньої частини комірки від верхньої частини комірки, що є неоднозначністю, про яку повідомляється. зверху, клітина руйнується. Але автоматичний макет також виявляє це і повертається до використання стандартної висоти рядка.
Для чого варто, і головним чином, щоб отримати закруглену відповідь, якщо ви реалізуєте динамічні висоти рядків на основі автоматичного макета iOS 8, вам слід реалізувати tableView:estimatedHeightForRowAtIndexPath:
. Цей метод оцінки може використовувати приблизні значення для ваших комірок, і він буде викликаний, коли початковий вигляд таблиці завантажений. Це допомагає UIKit намалювати такі речі, як смуга прокрутки, яку неможливо намалювати, якщо таблиця не знає, скільки вмісту він може прокручувати, але не потребує абсолютно точних розмірів, оскільки це просто смуга прокрутки. Це дозволяє відкласти обчислення фактичної висоти рядка до моменту, коли потрібна комірка, що є менш обчислювально обчислювальною та дозволяє швидше представити ваш UITableView.