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

После обновления до Xcode 6.1 beta 2 при запуске моего приложения, которое содержит ячейки таблицы, помощник отладки говорит:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell content view. We're considering the collapse unintentional and using standard height instead.

Раньше, когда я использовал Xcode 5 в этом проекте, я бы получил несколько ошибок, но они ушли с тех пор, как я обновился. У меня нет других ошибок или предупреждений. Я уже пробовал настраивать размеры всех ячеек таблицы, а также пытался использовать стандартную высоту, но я все равно получаю такое же предупреждение:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell content view. We're considering the collapse unintentional and using standard height instead.

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

Ответ 1

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

  • Чтобы настроить высоту ячейки по умолчанию в viewDidLoad

    self.tableView.rowHeight = 44;
    
  • Перейдите в раскадровку и измените высоту строки на вашем табличном представлении на нечто, отличное от 44.

  • Чтобы реализовать метод делегата tableview heightForRowAtIndexPath

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

Weird.

Ответ 2

Вы столкнулись с побочным эффектом фантастической новой функции в iOS8 Tableviews: Automatic Row Heights.

В iOS 7 у вас либо были строки фиксированного размера (задано с помощью tableView.rowHeight), либо вы пишете код для вычисления высоты ваших ячеек, и вы вернете это в tableView:heightForRowAtIndexPath. Написание кода для расчета высоты ячейки может быть довольно сложным, если у вас было множество просмотров в вашей ячейке, и у вас была разная высота для разных размеров шрифта. Добавить в Dynamic Type, и процесс был болью в заднице.

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

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

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

Пропуск макета работает так, что происходит непосредственно перед тем, как ячейка отображается на экране, точно так же:

  • Рассчитываются размеры контента с внутренними размерами. Это включает UILabels и UIImageViews, где их размеры основаны на тексте или UIImages, которые они содержат, соответственно. Оба эти представления будут считать их ширину известными (поскольку вы установили ограничения для конечных/ведущих ребер или задали явные ширины или использовали горизонтальные ограничения, которые в конечном итоге отображали ширину из стороны в сторону). Пусть говорят, что на ярлыке есть абзац текста ( "количество строк" ​​установлено в 0, поэтому он будет автоматически обертываться), он может быть только 310 точек в поперечнике, поэтому он определил, что он имеет высоту 120 пикселей при текущем размере шрифта.

  • Пользовательский интерфейс размещается в соответствии с вашими ограничениями на размещение. В нижней части метки есть ограничение, которое соединяется с нижним полем ячейки. Поскольку метка выросла до 120 пунктов, и поскольку она привязана к нижней части ячейки по ограничению, она должна подтолкнуть ячейку "вниз" (увеличивая высоту ячейки), чтобы удовлетворить ограничение, которое гласит "нижняя часть метка всегда является стандартным расстоянием от нижней части ячейки.

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

Для того, что стоит, и в основном иметь округленный ответ, если вы реализуете динамические высоты строк на основе iOS 8 Auto Layout, вы должны реализовать tableView:estimatedHeightForRowAtIndexPath:. Этот метод оценки может использовать приблизительные значения для ваших ячеек, и он будет вызываться, когда первоначально загружается представление таблицы. Это помогает UIKit рисовать такие вещи, как полоса прокрутки, которую нельзя рисовать, если табличное представление не знает, сколько контента он может прокручивать, но не нуждается в абсолютно точных размерах, поскольку это просто полоса прокрутки. Это позволяет рассчитывать фактическую высоту строки до момента, когда ячейка нужна, которая меньше вычислительно интенсивна и позволяет вашему UITableView быть представлен быстрее.

Ответ 3

Чтобы решить эту проблему без программного метода, отрегулируйте высоту строки в представлении таблицы в инспекторе размеров из раскадровки.

enter image description here

Ответ 4

У меня возникла эта проблема после создания пользовательского UITableViewCell и добавления моих подпрограмм в ячейку вместо contentView.

Ответ 5

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

Ответ 6

Сегодня я получил это предупреждение. Вот что заставило его исчезнуть для меня (в построителе интерфейса)

1.Установите поле высоты строки для представления таблицы на что-то другое, кроме 44 2 Установите поле высоты строки для ячейки tableView для чего-то другого, кроме 44

Мне не нужно было вносить какие-либо изменения в код

Ответ 7

Если вы используете статическую ячейку или динамическую ячейку, просто добавьте некоторую высоту строки в табличное представление в таблице инспекторов и снимите флажок с автоматической стороны справа от высоты строки, чтобы вы перестали получать это предупреждение. enter image description here

Ответ 8

Просто включите Ячейки Представления Таблицы Саморазмера

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

и убедитесь, что вы добавили ограничения со всех сторон UITableViewCell as-

enter image description here

Ответ 9

В моем случае я строил ячейку программно и продолжал получать эту ошибку.

Я добавил подпредставления и ограничения в методе init UITableViewCell следующим образом:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Я решил проблему, добавив их в ячейку contentView:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

Ответ 10

Я тоже испытал это предупреждение, перейдя на Xcode 6 GM. Я только получил предупреждение, когда я вернул устройство в исходное положение.

Я использую пользовательские UITableViewCells. В представлении таблицы раскадровки установлен мой собственный размер (в моем случае - 100,0). Хотя ячейки таблицы отображаются правильно, как в предыдущих выпусках, мне не понравилось предупреждающее сообщение.

В дополнение к вышеуказанным идеям я добавил это

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

Экран отображает... отвечает на поворот и больше предупреждений.

Ответ 11

В xcode 6.0.1 я удалил эти предупреждения, указав высоту строки, используя:

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

Ответ 12

Установите приблизительную высоту строки в ноль, и предупреждение исчезнет:

enter image description here

Ответ 13

Если вы создали Custom tableViewCell для tableView, убедитесь, что вы дали нижние и верхние ограничения для ваших ячеек, Вы также можете получить это сообщение, если ваши подпредставления внутри пользовательских ячеек выровнены по центру Y, что не приведет к появлению какого-либо сообщения об ошибке, но, в свою очередь, приведет к ошибке определения высоты строки для представления таблицы , как в изображении, которое у меня есть прилагается, здесь у нас есть как верхние, так и нижние ограничения

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

Но если это не работает, вы можете попробовать установить высоту строки для своей ячейки, а не автоматически , как на этом изображении

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

Ответ 14

В раскадровке установите поле cell Row height с тем же значением, что и Row height в tableView (оба с тем же значением, что и для меня).

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

Ответ 15

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

Ответ 16

У меня была эта проблема, когда мои метки и представления в пользовательском tableViewCell были привязаны к customCell, а не к Content View. Когда я очистил ограничения и связал их с ячейками Content View, проблема была решена.

Ответ 17

У меня было одно и то же сообщение об ошибке, убедитесь, что все ваши выходы действительны, как представление таблицы и представление таблицы.

Ответ 18

У меня та же ошибка, из-за этой строки эта ошибка была показана.

self.layer.backgroundColor = UIColor (белый: 1, альфа: 0,2) как! CGColor

Я просто изменяю строку следующим образом, чтобы исправить ошибку

self.layer.backgroundColor = UIColor (белый: 1, альфа: 0,2).cgColor