IOS8 - ограничения двусмысленно указывают на высоту нуля

Кто-нибудь понял, как отладить это?

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

Строки имеют фиксированную высоту, заданную

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

И все constraints кажутся счастливыми...

Ответ 1

Принудительная высота возврата и предполагаемая высота заставили предупреждение исчезнуть в моем случае.

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

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

Еще одно решение, в котором вам не нужны два переопределения, - это просто использовать self.tableView.rowHeight = 44; в вашем методе loadView или init.

Ответ 2

Что также можно сделать, это добавить вертикальные ограничения сверху и снизу содержимого. Это сделает автоспуск счастливым (потому что теперь он знает, как рассчитать высоту самой ячейки).

Ответ 3

Если вы используете ограничения autoLayout и UITableViewAutomaticDimension, эта ошибка не является некоторой ошибочной проблемой, которую нужно отбросить, переопределив высоту кода. Это означает, что определение высоты ячейки автоматически не работает, потому что у вас нет необходимых вертикальных ограничений.

Если вы похожи на меня и получили эту ошибку, и вам нужна помощь в определении того, какая ячейка выбрасывает ошибку, вы можете добавить следующую строку непосредственно перед возвратом вашего метода heightforRowAtIndexPath.

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

Это выведет длинный список разделов и строк, но ошибка появится сразу после конкретной ячейки, которая вызывает ошибку, и вы можете быстро определить, какая ячейка вызывает проблему, и соответственно исправить ваши ограничения. Это особенно полезно для статических ячеек. Переопределение высоты с введенным вручную номером будет работать, если вы не используете autoLayout и автоматическую высоту ячеек, но по существу отключите эти функции, которые являются очень плохим решением, если это то, что вы пытаетесь использовать.

Если вы ранее не использовали метод heightForRowAtIndexPath, но хотите отладить эту ошибку, не отменяя настройку UITableViewAutomaticDimension, просто добавьте это в свой код:

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

Ответ 4

В XCode 6.1 появляется ошибка, которая вызывает эту проблему при использовании автоматического макета, и вы не указываете значение для высоты строки для каждой ячейки таблицы просмотра, но вместо этого вы оставляете значение по умолчанию. Просто установите флажок "Пользовательский" рядом с высотой строки для каждой ячейки, чтобы предупреждение исчезло.

Ответ 5

Да, вы получаете все ограничения "счастливы" даже в том случае, если у вас есть только горизонтальные ограничения для элементов в ячейке таблицы. У меня была такая же проблема. Вам нужно добавить также вертикальные ограничения. Это значит, что это предупреждение исчезнет.

Ответ 6

Ограничения могут быть счастливы с целью компоновки, но не счастливы с точки зрения автоматической высоты строки. Счастливый макет будет означать, что контент можно выложить без двусмысленности. Это будет удовлетворять проверкам в Interface Builder.

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

Подробнее здесь: Обнаружен случай, когда ограничения двусмысленно указывают на высоту нуля

Ответ 7

Я использовал Row Height 43 (или < > 44) в инспекторе размера таблицы View, и ошибка исчезла. Используя 44, я получаю ошибку. Xcode версии 6.0.1.

- Этот ответ был удален модератором, пожалуйста, не делайте этого, он исправляет проблему. Это РЕШИТ проблему для меня и может сделать это и для других. Так что вы можете быть добрым, чтобы не удалять его снова.

Ответ 8

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

Ответ 9

Если вы получаете это предупреждение, это, скорее всего, потому, что вы используете автоматическую компоновку, и ваши ячейки не имеют никаких ограничений внутри них.

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

Вы можете отключить автоматическую компоновку в построителе интерфейса, сняв флажок "Использовать автозапуск" в инспекторе файлов справа.

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

Вертикальные ограничения

  • Ограничение вертикального пространства между верхней частью содержимого и верхней частью метки
  • Фиксированное ограничение высоты метки
  • Ограничение вертикального пространства между нижней частью метки и нижней частью содержимого.

Горизонтальные ограничения

  • Ограничение горизонтального пространства между передним краем представления содержимого и передним краем метки
  • Ограничение фиксированной ширины метки
  • Ограничение горизонтального пространства между задним фронтом метки и задним фронтом представления содержимого

Ответ 11

В 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)
    }
}

Ответ 12

Для стандартного исправления болота, никаких ограничений, оценки высоты или сложности проектирования. Я создал проект по умолчанию, подключил tableview, но забыл поместить делегат высоты в контроллер представления. Чтобы просто сделать это предупреждение, вам нужно это.

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

В вашем контроллере представления таблиц.

Ответ 13

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

1) Очистите ограничения содержимого.

2) Установите Reset в Рекомендуемые константы в contentView.

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

3) Добавьте отсутствующие ограничения - если есть

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

Ответ 14

В моем случае это связано с тем, что я проектирую ячейку с помощью xib, и я забываю добавить этот xib файл в цель.

После того, как я добавлю этот xib файл в цель, проблема исчезла

Ответ 15

В то время как ответы на этой странице, посвященные добавлению ограничений по высоте или ручному возврату rowHeights, как 44 в heightForRowAtIndexPath, вызывают предупреждение уйти, они излишни, потому что это ошибка в Xcode, видимая, по крайней мере, в версии Version 6.3.2 (6D2105).

Если вы установите точку останова в viewDidLoad, вы увидите, что self.tableView.rowHeight = -1 (UITableViewAutomaticDimension), даже если вы указали высоту строки 44 в раскадровке. Это связано с тем, что Apple неправильно предполагает, что вы хотите динамические высоты строк, если вы оставите высоту строки на уровне 44, потому что они не предоставили вам флаг для указания ваших предпочтений.

Вот некоторые возможные решения и их результаты:

  • Установите высоту строки до 43 или 45 в раскадровке (работает).

  • Вручную верните высоту 44 в heightForRowAtIndexPath (работает).

  • Добавить ограничения высоты между элементами UITableViewCells и его содержимым (работает).

К сожалению, эти решения требуют от вас изменения дизайна, добавления ненужных ограничений или добавления ненужного кода для устранения ошибки. Я попробовал (как я думал) простейшее решение:

  • Установите каждую высоту UITableViewCells до 44 (Custom) в раскадровке (не удается).

Мне очень понравилось чистое решение для раскадровки, поэтому, наконец, я попробовал:

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

enter image description here

enter image description here

Эти ошибки слишком распространены в iOS-разработке и заставляют разработчиков тратить слишком много времени на взвешивание последствий того, как их решения повлияют на ремонтопригодность в долгосрочной перспективе.

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

Ответ 16

Думаю, здесь происходят две важные вещи.

1) Очень легко сделать ограничения неправильными, если вы перетаскиваете Ctrl+. Итак, дважды проверьте, что вы сделали это правильно. Лучше всего использовать лоток в левой части экрана, чтобы нарисовать эти ограничения.

2) Вместо указания оценочного значения RowHeight в ViewDidLoad или в другом месте используйте метод делегата

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

Это сразу устранило проблему.

Ответ 17

Я также видел эту ошибку при использовании универсальных раскадровки или xib. Если вы не указали правильные ограничения для класса Any x Any size, я видел, что эта ошибка появляется.

Apple, похоже, исправила это для iOS9. Ошибка только для 8.4 для меня.

Ответ 18

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