iOS8 - обмеження неоднозначно підказують висоту нуля


100

Хтось має ідею, як це налагодити?

Попередження лише один раз: Виявлено випадок, коли обмеження неоднозначно пропонують висоту нуля для перегляду вмісту комірки таблиці. Ми розглядаємо випадковий збій і використовуємо замість нього стандартну висоту.

Рядки мають встановлену висоту

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}

І всі, constraintsздається, щасливі ...

Відповіді:


129

Примушування висоти повернення та розрахункової висоти змусило попередження зникнути в моєму випадку.

- (CGFloat)tableView:(UITableView *)tableView 
           estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

Ще одне рішення, коли вам не потрібні два переосмислення, - це просто використовувати self.tableView.rowHeight = 44;у своєму loadViewметоді чи init.


1
У мене є кілька рядків типу в розрізі, і лише один з них має динамічну висоту. то це не працює
Raj Aggrawal

Якщо ми встановимо висоту за замовчуванням у xib / storyboard, нам не доведеться реалізовувати ці методи.
Сатьям

77

Також можна додати вертикальні обмеження зверху та внизу подання вмісту. Це зробить авторозкладку щасливою (адже він тепер знає, як сам розрахувати висоту комірки).


2
Це працювало для мене. Я пройшов усі клітинки контейнера і переконався, що принаймні один підвід має як обмеження "верхнього простору до контейнера", так і обмеження "простір в нижньому для контейнера".
Rog182

7
Це правильна відповідь для iOS 8 при використанні самостільних розмірів комірок подання таблиці.
цафрір

1
Ви маєте на увазі обмеження від елементів всередині перегляду вмісту до верху та внизу подання вмісту?
Зак Шапіро

Я спробував це, але все одно отримую конфліктне попередження про обмеження.
Ширіш Кумар

2
Переконайтеся, що ви додаєте верхнє та нижнє обмеження до перегляду вмісту комірки, а не самої комірки. Якщо ви додасте обмеження для комірки, код все одно буде працювати, але спробує використовувати висоту 0.
frin

26

Якщо ви використовуєте обмеження для автоматичного розкладу та UITableViewAutomaticDimension, ця помилка не є якоюсь помилковою проблемою, яку слід усунути, переосмисливши висоту коду. Це означає, що визначення висоти комірки автоматично не працює, оскільки у вас немає необхідних вертикальних обмежень.

Якщо ви схожі на мене і вам була потрібна ця помилка, і вам потрібна допомога визначити, яка клітина викидала помилку, ви можете додати наступний рядок перед поверненням вашого методу 'heightforRowAtIndexPath'.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Це дозволить роздрукувати довгий список розділів і рядків, але помилка з’явиться відразу після конкретної комірки, яка викликає помилку, і ви зможете швидко визначити, яка клітина викликає проблему, і виправити свої обмеження відповідно. Це особливо корисно для статичних комірок. Переопределення висоти на введене вручну число буде працювати, якщо ви не використовуєте автоматичну розкладку та автоматичну висоту комірок, але по суті буде відключити ці функції, що є дуже поганим рішенням, якщо це щось, що ви намагаєтеся використовувати.

Якщо раніше ви не використовували метод 'heightForRowAtIndexPath', але хочете налагодити цю помилку, не скасовуючи налаштування UITableViewAutomaticDimension, просто додайте це до свого коду:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

Дуже дякую Це мені дуже допомогло. Спочатку я думав, що проблема була в іншій комірці перегляду таблиці. Після налагодження виявилося, що проблема була з іншою.
акозін

Я хотів би це зробити, але довгий розділ та рядок невідомі. Не могли б ви пояснити, що це повинно бути у Свіфта?
DrWhat

9

Здається, що в XCode 6.1 є помилка, яка спричиняє цю проблему при автоматичному розташуванні, і ви не вказуєте значення для висоти рядка для кожної комірки огляду таблиці, але замість цього ви залишаєте значення "за замовчуванням". Якщо просто встановити прапорець "Користувацький" поруч із висотою рядка, для кожної комірки попередження відключається.


2
Якщо ви використовуєте комірки з розміром з розмірами, вам потрібно залишити висоту рядка "за замовчуванням".
phatmann

1
Це вирішило попередження. Але я вважаю, що це з'являється лише при використанні статичних комірок у TableView
MontiRabbit

1
@phatmann Ця проблема з'являється лише для статичних комірок, отже, клітини не повинні бути саморозмірними.
LTM

@ltm чи може самостійне розмір комірок не стати корисним у статичних комірках, якщо користувач може збільшити текст? (Ви знаєте, під доступністю в налаштуваннях iPhone)
Байрон Коетзе

Я думаю, що це не помилка. Це може бути проблема з вертикальними обмеженнями, вони повинні повністю описати висоту комірки, як мінімум, для настільних переглядів з автоматичним розміром.
juanjo

3

Так, ви отримуєте всі обмеження "щасливими", навіть якщо у вас є лише горизонтальні обмеження для елементів у комірці подання таблиці. У мене був такий самий випуск. Вам потрібно додати також вертикальні обмеження. Якщо це зробити, це попередження знищиться.


3

Обмеження можуть бути задоволені з метою компонування, але не задоволені з метою автоматичної висоти рядка. Щасливий макет означав, що вміст може бути викладений без неоднозначності. Це задовольнило б чеки в Interface Builder.

Приємний макет для автоматичної висоти рядка означав би, що крім вищезазначеного, ви також включаєте обмеження на нижню частину комірки.

Детальніше тут: Виявлено випадок, коли обмеження неоднозначно підказують висоту нуля


3

Я використовував висоту рядка 43 (або <> 44) в інспекторі розмірів таблиці, і помилка зникла. Використовуючи 44, я отримую помилку. Версія Xcode 6.0.1.

- Цю відповідь модератор видалив, будь ласка, не, вона вирішує проблему. Це вирішує проблему для мене і може робити це і для інших. Тож ви можете бути таким добрим, щоб не видаляти його знову.


2

Я не зміг видалити попередження, але щоб обмеження працювали, я встановив нове для iOS8 властивість tableview estimatedRowHeightна фіксовану висоту та видалив heightForRowAtIndexPathреалізацію.


Якщо він не видалив попередження, то це система, яка заповнює відсутнє обмеження та встановлює висоту рядка == до властивості cell.rowHeight. Попередження стосується властивості автоматичного зцілення, якщо воно автоматично загоїлося, значить, проблеми там не було?
Педро Борхес

2

Якщо ви отримуєте це попередження, це, швидше за все, ви використовуєте автоматичний макет, і ваші клітини не мають жодних обмежень всередині них.

Вам слід або припинити використання автоматичного макета, або застосувати обмеження, які однозначно визначають висоту комірок.

Ви можете вимкнути автоматичну компоновку в програмі інтерфейсу, знявши прапорець "Використовувати автоматичне вимикання" в інспекторі файлів праворуч.

Якщо ви вирішили використовувати автоматичне розташування і висота ваших комірок є фіксованою, реалізація відповідних обмежень повинна бути простою. Просто додайте обмеження по висоті для підзаписів перегляду вмісту комірки та впроваджуйте вертикальні обмеження простору між підглядами та між підглядами та поданням вмісту. Наприклад, якщо у вашій комірці є одна мітка, це працює:

Вертикальні обмеження

  1. Вертикальне обмеження простору між вершиною подання вмісту та верхом мітки
  2. Фіксоване обмеження висоти етикетки
  3. Вертикальне обмеження місця між нижньою частиною мітки та нижньою частиною подання вмісту

Горизонтальні обмеження

  1. Горизонтальне обмеження простору між передньою межею перегляду вмісту та передньою межею мітки
  2. Виправлена ​​ширина обмеження етикетки
  3. Горизонтальне обмеження простору між кінцевим краєм етикетки та кінцевим краєм подання вмісту

Я використовую обмеження, і всі вони, здається, задоволені, про що йдеться в питанні.
Кріс

Чи є ці обмеження для підзагляду вмісту комірки? Як вони виглядають? Чи можливо у вас є клітини, які відрізняються? Якщо ви визначаєте, щоб клітини мали фіксовану висоту, використовуючи рішення Фредеріка Боннера, обмеження скасовуються.
wrightak

1

Ви можете використовувати AutoLayout для обчислення потрібної для вас висоти. Ось приємний пост про Dynamic Cell Height на iOS 8: http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/


Мені б хотілося, щоб це було просто. Додавання цих двох рядків, на жаль, не вирішило мою проблему автоматизації
Зак Шапіро,

1

У Swift вимушення висоти повернення вирішило мою проблему:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

Для болотного стандартного виправлення, без обмежень, без оцінювання висоти або над інженерною проблемою. Я створив проект за замовчуванням, з'єднав viewview, але забув помістити делегат висоти в контролер подання . Щоб просто зняти це попередження, вам потрібно це.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 44;
}

У контролері подання таблиці.


1

Я використовував mapView всередині uitableviewcell. Я змінив висоту перегляду карти на 1/3 розміру екрана пристрою. Я отримав таку ж помилку. Я виправив помилку, додавши пропущені обмеження до перегляду вмісту uitableviewcell.

1) Очистіть обмеження contentView.

2) Встановіть Скинути запропоновані константи на contentView.

введіть тут опис зображення

3) Додайте відсутні обмеження - якщо такі є

4) Ми впевнені, що перегляд вмісту має всі необхідні обмеження. введіть тут опис зображення


0

У моєму випадку це тому, що я конструюю комірку з xib, і я забуваю додати цей xib файл до цілі.

Після того, як я додаю цей xib файл до цілі, проблема не зникає


0

Хоча відповіді на цій сторінці, що обговорюють додавання обмежень по висоті або повернення вручну рядкових висот, рівних 44 у висотуForRowAtIndexPath, викликають попередження про відхід, вони є зайвими, оскільки це помилка в Xcode, видно щонайменше у версії 6.3.2 (6D2105).

Якщо встановити в viewDidLoad точку розриву, ви побачите, що self.tableView.rowHeight = -1 (UITableViewAutomaticDimension), навіть якщо ви вказали висоту рядка 44 у дошці повідомлень. Це тому, що Apple неправильно припускає, що ви бажаєте динамічної висоти рядків, якщо залишити висоту рядка в 44, оскільки вони не надали вам прапор для вказівки ваших уподобань.

Ось кілька можливих рішень та їх результати:

  • Встановіть висоту рядка на 43 або 45 у рекламній дошці (працює).

  • Вручну поверніть висоту 44 у висотуForRowAtIndexPath (працює).

  • Додайте обмеження по висоті між елементами UITableViewCell та його contentView (працює).

На жаль, ці рішення або вимагають від вас змінити дизайн, додати зайві обмеження або додати непотрібний код, щоб обійти помилку. Я спробував (що я вважав) найпростішим рішенням:

  • Встановіть висоту кожного UITableViewCell на 44 (Користувацьке) на дошці повідомлень (не вдається).

Мені дуже хотілося вирішити це питання, тому нарешті я спробував:

  • Додайте визначений користувачем атрибут UITableView, визначений користувачем, на дошці повідомлень і назвіть UITableView із зазначенням про те, як встановлюється його rowHeight, щоб майбутні розробники могли його знайти: (працює):

введіть тут опис зображення

введіть тут опис зображення

Ці помилки занадто поширені в розробці iOS і змушують розробників витрачати зайвий час, зважуючи наслідки того, як їх рішення впливатимуть на ремонтоздатність у довгостроковій перспективі.

Оскільки пошук концептуально правильного рішення, яке є досяжним і не здається заплутаним, є настільки невловимим, і якщо припустити, що Apple виправить помилку і що 44 буде висотою рядка за замовчуванням в осяжному майбутньому, то обмеження або визначено користувачем Рішення атрибутів виконання, мабуть, є найбільш ретельними.


0

Думаю, тут відбуваються дві важливі речі.

1) Зробити обмеження неправильно, якщо ви ctrl + перетягування, дуже просто. Отже, двічі перевірте, чи правильно ви це зробили. Найкраще використовувати лоток ліворуч на екрані, щоб намалювати ці обмеження.

2) Замість вказівки оцінюваногоRowHeight у ViewDidLoad або деінде використовуйте метод делегування

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Це вирішило проблему відразу для мене.


Чому ви використовуєте переопределення?
FractalDoctor

0

Я також бачив цю помилку під час використання універсальних розкадрів або xibs. Якщо ви нехтуєте вказати належні обмеження для класу розмірів Any x Any, я помітив, що ця помилка з’являється.

Apple, схоже, виправила це для iOS9. Помилка сталася лише для 8,4.


0

Я цілими днями обходився між цією помилкою та іншою помилкою, в якій створювалися обмеження (не маю уявлення, де), що суперечило бажаним обмеженням. Я навіть працював в одному випадку, коли кожне видиме властивість було ідентичним іншому. Єдине рішення, яке я знайшов, - атомний - створити абсолютно новий файл з xib і знову почати відновлювати розетки, копіюючи-вставляючи старий код. Це може бути не найкращим рішенням, але іноді, якщо проблема не видно, робити ще мало чого. Принаймні, атомний - хороший спосіб переглянути те, що відбувається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.