UITableViewCell не меняет высоту, когда некоторые подпредставления UIStackView не скрыты
Как видно из заголовка, у меня есть пользовательский UITableCell, в котором у меня есть несколько UIStackViews. Каждый из этих стеков содержит много подпредставлений, но я просто хочу показать три из них, когда ячейка отображается в первый раз. Если пользователь хочет видеть больше, есть кнопка [+], которая вызывает метод, который добавляет оставшиеся.
Настраиваемая высота ячейки определяется с помощью UITableViewAutomaticDimension, и она отлично работает для первого отображения ячейки, но когда я пытаюсь добавить и удалить подпредставления в стеке, есть представления, которые не следует изменять, которые теряют свои ограничения, и те, которые должны отображаться не делает это в некоторых случаях. Я хотел бы показать все метки UILabels и высоту ячейки для обновления.
Метод, который вызывается при нажатии кнопки [+], является следующим:
@objc private func changeImage(sender: UIButton) {
let index = (Int(sender.accessibilityValue!)!)
let open : Bool = openItem[index]
let plateStack : UIStackView = plateStacks[index]
let plates : [UILabel] = platesViews[index]
if !open {
sender.setImage(UIImage(named: "less")?.withRenderingMode(.alwaysTemplate), for: .normal)
let nPlatesToAdd = max(platesViews[index].count - 3, 0)
for i in 0..<nPlatesToAdd {
let plate = plates[i + 3]
plateStack.addArrangedSubview(plate)
plate.leadingAnchor.constraint(equalTo: plateStack.leadingAnchor, constant: 0).isActive = true
plate.trailingAnchor.constraint(equalTo: plateStack.trailingAnchor, constant: 0).isActive = true
}
}
else {
sender.setImage(UIImage(named: "more")?.withRenderingMode(.alwaysTemplate), for: .normal)
var i = plateStack.arrangedSubviews.count - 1
while i > 2 {
let view = plateStack.arrangedSubviews[i]
plateStack.removeArrangedSubview(view)
view.removeFromSuperview()
i = i - 1
}
}
openItem[index] = !open
}
Первое отображение ячейки (все в порядке) и после нажатия на кнопку [+]:
1 ответ
Это произошло потому, что tableView уже визуализировал свой макет. Возможно, вам придется проверить некоторые причины:
- убедитесь, что ограничение stackView правильно помещено в contentView
- Распределение stackView должно быть
fill
После того, как вы изменили что-то, что влияет на высоту tableView, вы можете использовать этот код для обновления высоты ячейки без перезагрузки таблицы:
tableView.beginUpdates()
tableView.endUpdates()