it-swarm.com.ru

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

После обновления до 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.

90
David E

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

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

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

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

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

Weird.

95
Viktor Kucera

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

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

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

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

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

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

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

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

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

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

177
Woodster

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

9
ABakerSmith

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

enter image description here

8
Anconia

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

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

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

4
humblePilgrim

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

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

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

 enter image description here

3
Jack

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

3
Alok

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

2
Amit Verma

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

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

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

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

addSubview(rankingLabel)
addConstraints(cellConstraints)

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

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

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

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

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

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

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

1
DannyJi

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

0
Micah Montoya

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

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

0
Caipivara

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

0
Marija Zivkovic

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

0
Gulz