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


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

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

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

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

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

15 83

15 ответов:

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

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

    self.tableView.rowHeight = 44;
    
  • перейдите в раскадровку и измените высоту строки на своем tableview на что-то другое, чем 44.

  • для реализации метода делегата tableview heightForRowAtIndexPath

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

странно.

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

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

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

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

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

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

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

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

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

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

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

enter image description here

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

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

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

Мне не пришлось вносить никаких изменений в код

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

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

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

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

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

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

экран отрисовывает... реагирует на вращение и больше никаких предупреждений.

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

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

просто включите самостоятельное определение размеров ячеек таблицы

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

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

enter image description here

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

я добавлял подвиды и ограничения в UITableViewCell ' s init способ такой:

addSubview(rankingLabel)
addConstraints(cellConstraints)

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

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

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

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

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

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

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