2015-08-23 5 views
17

У меня есть пользовательский UITableViewCell, который имеет уменьшенное изображение и кучу текста. Высота строки выполнена с возможностью быть рассчитано автоматически с помощьюUITableView auto resizing row constraint ломается загадочно на iPhone 6Plus

tableView.estimatedRowHeight = 129; 
tableView.rowHeight = UITableViewAutomaticDimension 

высоты строки должна быть рассчитана как точно точек. Все выглядит отлично на iPhone 5. Тем не менее, на iPhone 6 Plus высота автоматической строки не срабатывает для случайных строк со следующим журналом.

(
    "<NSLayoutConstraint:0x17009ddd0 V:|-(20)-[scoop.ThumbnailImage:0x124d2a5a0] (Names: '|':UITableViewCellContentView:0x124e23200)>", 
    "<NSLayoutConstraint:0x17009de70 UITableViewCellContentView:0x124e23200.bottomMargin == scoop.ThumbnailImage:0x124d2a5a0.bottom + 20>", 
    "<NSLayoutConstraint:0x17009e780 V:[scoop.ThumbnailImage:0x124d2a5a0(90)]>", 
    "<NSLayoutConstraint:0x17009ef00 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x124e23200(138.333)]>" 
) 

В последней строке журнала, кажется, говорят, что по какой-то причине высота строки была рассчитана как 138.333вместо 138. Я уже немного стучал головой, но я не могу понять, почему это происходит. Может кто-нибудь, пожалуйста, помогите?

Обновление: Так выглядит моя ячейка просмотра таблицы.

cell

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

+0

Можете ли вы опубликовать код, который вычисляет высоту ячейки? –

+0

Я использую tableView.estimatedRowHeight = 129; tableView.rowHeight = UITableViewAutomaticDimension для вычисления высоты строки в viewDidLoad моего контроллера. – suparngp

+0

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

ответ

22

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

enter image description here

+3

Это будет работать, но это все равно означает, что ограничение как-то ломается, не так ли? – suparngp

+0

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

+0

, когда явная высота не соответствует макету авто, установка более низкого приоритета говорит ему игнорировать это конкретное ограничение и продолжать движение , это цель приоритетов - избежать конфликтов в разных сценариях. – Yariv

0

Предупреждение сообщает вам, в чем проблема, но вы не можете этого понять. Первые три ограничения предназначены для изображения с высотой 90 пикселей, что на 20 пикселей ниже вершины его контейнера, и на 20 пикселей выше нижней границы его контейнера margin. Это 130, и это несовместимо с четвертым ограничением, которое требует общей высоты 138. Однако, поскольку ограничение нижнего края относится к маркеру контейнера, это добавляет определенное количество пикселей больше. Удалите общее ограничение по высоте (моя рекомендация) или измените количество верхнего и нижнего края.

+0

Дно ограничено краем, который добавит дополнительные 8 очков. Таким образом, общая сумма составляет 138. Проблема заключается в дополнительном 0,333, который вычисляется с помощью tableView.rowHeight = UITableViewAutomaticDimension. На iPhone 5 он правильно вычисляет высоту на 138 пунктов. – suparngp

+0

Я только что загрузил ваш проект, и первое, что выделяется, это то, что в раскадровке есть две ошибки макета: у изображения Pink Floyd и ярлыка нет позиций 'y'. Я собираюсь вставить его. – NRitH

+0

Все необходимые ограничения присутствуют. Просто увеличьте высоту строки на одну точку. Я обновил проект. Пожалуйста, потяните последний код. – suparngp

2

0,333 на 3x шкалы дисплея (что iPhone 6+), вероятно, связано с разделителем клеток.

Обратите внимание, что ваши ограничения не устанавливают размер ячейки, они устанавливают размер contentView. Но ячейка должна добавить 2 пикселя (= 0,666 точек) к высоте ячейки для разделителя ячеек. Autolayout пытается сохранить позиции позиций на целочисленных границах, поэтому добавление 0,666 точек к высоте ячейки может привести к добавлению 0,333 к вашей высоте содержимого.

Вы можете избежать ошибки, установив разделители таблиц на None. Хотя установка одного из приоритетов на 999 (обычно нижний приоритет), поскольку другой answer предложил, является хорошим решением в целом.

+0

Удаление разделителя не решает эту проблему. – suparngp