Ограничение Auto Layout нарушается при изменении условия в ячейке табличного представления - PullRequest
0 голосов
/ 19 сентября 2018

В моей ячейке tableView у меня есть массив строк из API, который я использую для определения высоты стека в зависимости от количества элементов массива.Массив может иметь 3, 4 или X элементов.

var pollDataInPollCell: PollModel? {
        didSet{
            if let pollOptions = pollDataInPollCell?.poll_detail{
                // pollOptions = ["A", "B"] or ["A", "XS", "XSMAX"]

           optionBtnStackView.heightAnchor.constraint(equalToConstant: CGFloat(30 * pollOptions.count).isActive = true
}
var optionBtnStackView: UIStackView = {
   let sv = UIStackView()
    sv.axis = .vertical
    sv.distribution = .fillEqually
    return sv
}()

Все отлично работает при запуске.Высота stackView для каждой строки выглядит безупречно, и ограничений нет.Однако, если я прокручиваю вверх и вниз табличное представление, моя высота stackView больше не является той же самой, и я полагаю, что это происходит из-за tableView dequeueReusableCell.Мой вопрос заключается в том, можно ли сбросить мою высоту stackView в didSet, чтобы он мог отображать новую высоту.Я пробовал это в didSet

optionBtnStackView.heightAnchor.constraint(equalToConstant: 0).isActive = true
optionBtnStackView.heightAnchor.constraint(equalToConstant: CGFloat(30 * pollOptions.count).isActive = true

или

optionBtnStackView.heightAnchor.constraint(equalToConstant: CGFloat(30 * pollOptions.count).isActive = false
optionBtnStackView.heightAnchor.constraint(equalToConstant: CGFloat(30 * pollOptions.count).isActive = true

, но оба не решают мою проблему.Какие-либо предложения?Большое вам спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

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

Эта строка:

optionBtnStackView.heightAnchor.constraint(equalToConstant: CGFloat(30 * pollOptions.count)).isActive = true

создает и активирует new ограничение.Если вы снова вызываете ту же строку с другими данными, добавляется новое ограничение с другой высотой, а затем они сталкиваются.

Решение должно быть довольно простым и простым.Сначала создайте свойство и сохраните ссылку на одно ограничение.Затем при настройке данных просто обновите константу и не создавайте новое ограничение.

Например, что-то вроде:

fileprivate var stackHeightConstraint: NSLayoutConstraint?

var pollDataInPollCell: PollModel? {
    didSet {
        if let pollOptions = pollDataInPollCell?.poll_detail {
            // lazily initialized heightConstraint:
            if stackHeightConstraint == nil {
                // this creates the constraint and keeps a reference to it
                stackHeightConstraint = optionBtnStackView.heightAnchor.constraint(equalToConstant: CGFloat(30 * pollOptions.count))
                // and we can activate it properly
                stackHeightConstraint?.isActive = true
            } else {
                // here the stackHeightConstraint is initialized, so just set the constant
                stackHeightConstraint?.constant = CGFloat(30 * pollOptions.count)
            }
        }
    }
}
...