Swift UITableViewCell не может установить ограничение после cellForRowAtIndexPath - PullRequest
0 голосов
/ 14 мая 2018

В моем tableViewController я использую пользовательскую ячейку, которая содержит imageView, две метки и некоторые другие нерелевантные элементы. Также есть ограничение, значение константы которого должно быть изменено, если задано определенное условие. Это отлично работает на первый взгляд, но если я прокручиваю вниз и получаю ячейки, в которых константе ограничения задано другое значение, некоторые из следующих ячеек вроде бы сохраняют эту константу из этой предыдущей ячейки и не устанавливают ее при появлении.

Это релевантная часть моего cellForRowAtIndexpath:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let identifier = whichCellToShow ? "ThisCell" : "TheOtherCellCell"

    //...

    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)

    if let customCell = cell as? CustomCellProtocol,
       indexPath.section < data.count,
       indexPath.row < data[indexPath.section].count {

        customCell.display(data: data[indexPath.section][indexPath.row])
    }

    return cell
}

Это соответствующие части моего пользовательского класса ячеек:

class CustomCell: UITableViewCell, CustomCellProtocol {
@IBOutlet weak var picture: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var weblink: UILabel!
@IBOutlet weak var titleIndentationConstraint: NSLayoutConstraint!
//...

    func display(data: Data) {

        //...

        title.text = data.title

        //...

        weblink.text = data.hasWeblink ? URLUtilities.hostOfURL(urlstr: data.sourceUrl) : nil
        weblink.isHidden = !data.hasWeblink
        //This is the spot where things seem to go wrong
        titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0
        setNeedsLayout()
        layoutIfNeeded()
    }
}

Если data.hasWeblink == true константа ограничения должна быть равна высоте метки веб-ссылки, если она ложна, она должна быть 0.

Моей первой мыслью было, что переработка представления UITableView может столкнуться с titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0. Вот почему я позвонил setNeedsLayout() и layoutIfNeeded() сразу после этого, но, похоже, это не помогло. Все остальные элементы клетки выполняют свою работу правильно.

Также я устанавливаю tableView.rowHeight и tableView.estimatedRowHeight внутри viewDidLoad() моего tableViewController.

У кого-нибудь есть идея, что, в частности, идет не так или что я забыл сделать? Спасибо вперед!

1 Ответ

0 голосов
/ 14 мая 2018

Исправил это сам, пришлось изменить некоторые приоритеты ограничения метки заголовка:

Метка моего заголовка имеет нижнее ограничение, которое всегда больше или равно 8 пунктам.Также я ограничил количество строк до 4 и сказал метке обрезать хвост текста, если он слишком длинный для отображения.Как ни странно, если текст был обрезан, я получал глупое поведение, описанное выше, так что это не имеет абсолютно никакого отношения к моему titleIndetantionConstraint.Похоже, что если текст должен быть усечен, метка выровнялась по нижнему ограничению и вроде перетащила содержимое по центру влево (посмотрите, что режим содержимого говорит в редакторе свойств, этодолжен быть оставлен по умолчанию).Хотя изменение режима содержания ярлыка кажется мне плохой идеей, я уменьшил priority нижнего ограничения метки заголовка на 1, чтобы он выровнялся в верхней части рисунка, как я и планировал.Надеюсь, это поможет людям с похожими проблемами B).

...