2017-02-14 3 views
0

Я просмотрел статьи, связанные с динамической ячейкой таблицы и автоматической компоновкой в ​​течение 3 дней и не работал до сих пор.Динамическая таблица высоты таблицы с автоопределением и UITableAutomaticDimension (Dynamic UILabel + несколько UIImageViews)

Ниже приведена таблица, которую я хотел. Здесь основной проблемой является UILabel для текстовых сообщений и UIImages.

enter image description here

Вот иерархия элементов пользовательского интерфейса.

- Content View 
    + ... 
    + UILabel for text - dynamic height 
    + UIView - image view container 
     * UIImageView 
     * UIImageView 
     * .... 

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

enter image description here

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

Вот выход ошибки:

Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want.  
Try this:  
(1) look at each constraint and try to figure out which you don't expect;  
(2) find the code that added the unwanted constraint or constraints and fix it. 

"<NSLayoutConstraint:0x17428aaf0 V:|-(0)-[UIImageView:0x14be77ed0] (active, names: '|':UIView:0x14be75b20)>", 
"<NSLayoutConstraint:0x17428a6e0 UIImageView:0x14be77ed0.height == 160 (active)>", 
"<NSLayoutConstraint:0x17428acd0 UIImageView:0x14be77ed0.bottom == UIView:0x14be75b20.bottom (active)>", 
"<NSLayoutConstraint:0x174289650 V:|-(0)-[UIImageView:0x14be43ce0] (active, names: '|':UIView:0x14be75b20)>", 
"<NSLayoutConstraint:0x17428bb80 UIImageView:0x14be43ce0.height == 160 (active)>", 
"<NSLayoutConstraint:0x17428be50 V:[UIImageView:0x14be43ce0]-(10)-[UIImageView:0x14be74b10] (active)>", 

"<NSLayoutConstraint:0x17428bfe0 UIImageView:0x14be74b10.height == 160 (active)>", 
"<NSLayoutConstraint:0x17428c080 UIImageView:0x14be74b10.bottom == UIView:0x14be75b20.bottom (active)>" 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x17428be50 V:[UIImageView:0x14be43ce0]-(10)-[UIImageView:0x14be74b10] (active)> 

Пожалуйста, помогите мне с этим вопросом. Спасибо.

+0

Не могли бы вы показать больше кодов или раскадровки или ячейки? – anhtu

+0

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

+0

@ ХиманшуМорадия, нет предела. Пользователи могут прикреплять изображения, которые они хотят. –

ответ

0

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

+0

Я пробовал, но изображения перекрываются, и ограничения ломаются. –

+0

@Florens von Buchwaldt это больше похоже на комментарий. Вы должны давать предложения в комментарии не в ответ. –

+0

@PaulStein Остерегайтесь: https://developer.apple.com/reference/uikit/uistackview предназначен только для iOS 9.0+. –

1

Чтобы убедиться, что вид стеки не содержит старые изображения, когда из очереди клетки, необходимо очистить его в prepareForReuse():

override func prepareForReuse() { 
    super.prepareForReuse() 

    stack.arrangedSubviews.forEach { 
     stack.removeArrangedSubview($0) 
     $0.removeFromSuperview() 
    } 
} 
+0

Я удалил все виды изображений из вида контейнера и снова добавил и работает. Но вид изображения мерцает. Есть ли лучший способ показать изображения плавно? –

0

добавляет ImageViews во время выполнения и имеет ограничение для ограничений верхнего, верхнего, конечного, нижнего и верхнего пределов.

Это ваше сообщение об ошибке. Удалите либо высота, либо одно из ограничений, которое вы выберете либо снизу, либо сверху contraint. Вы не можете ограничить все 4 стороны и добавить к этому ограничение высоты.

Sidenote:

Это идет одинаково для ширины, если вы установите ограничение ширины, вы не можете иметь обе стороны/задние ограничена в то же время.

EDIT:

Кроме того, легче прочь с помощью UIStackView как предложено в комментариях разделов.

+0

@PaulStein Я рад, что он работает! Не знаете, что вы имеете в виду, какую часть вы хотите включить в ответ выше? –

+0

@PaulStein Сделано! –

Смежные вопросы