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

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

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 в этом проекте, я получал несколько ошибок, но они исчезли с тех пор, как я обновился. У меня нет других ошибок или предупреждений. Я уже пытался настроить размеры всех ячеек таблицы, а также пытался использовать стандартную высоту, но я все еще получаю то же предупреждение:

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 ответов

Решение

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

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

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

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

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

Weird.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

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

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

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

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

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

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

Я добавлял подпредставления и ограничения в UITableViewCell"s init метод как это:

addSubview(rankingLabel)
addConstraints(cellConstraints)

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

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

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

ht tps:https://stackru.com/images/0299261d18967092794cb6ed03e1d5510eee831f.png

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

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

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

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

Я получил это предупреждение сегодня Все, что я сделал, это просто добавил одну дополнительную строку в свой код

tableView.rowHeight = 200;

добавьте эту строку кода внутри

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

и окончательный код выглядит как

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

этот код увеличит высоту ячейки строки таблицы до 200, высота по умолчанию - 44

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

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

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

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

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

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

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

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

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

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

Я просто добавил в ячейку дополнительное ограничение:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

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

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

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

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

Если вы расширяете свой класс ViewController с помощью UITableView, а также используете контроллер навигации для отображения экрана, тогда вам не нужно выполнять переход с идентификатором, это может вызвать ошибку идентификатора ViewController, вы можете использовать метод pushViewController, чтобы показать экран чата, чтобы получить избавьтесь от этой ошибки, поэтому вот код, просто вставьте его в свой делегат UItableView

let chatBox = ChatBoxViewController() navigationController?.pushViewController(chatBox, animated: true)

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

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

self.layer.backgroundColor = UIColor(white: 1, alpha: 0.2) as! CGColor

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

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

Если вы производите динамический расчет высоты,

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