Высота UITableViewCell не вычисляется динамически даже со всеми добавленными ограничениями - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь создать собственный UItableViewCell с тремя метками. Два из них слева (как встроенный макет заголовка + субтитров), а другой - справа. Я выкладываю метки программно.

class CustomCell: UITableViewCell {
    static let identifier = String(describing: self)
    
    lazy var primaryLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.font = UIFont.preferredFont(forTextStyle: .body)
        return label
    }()
    
    lazy var secondaryLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.font = UIFont.preferredFont(forTextStyle: .footnote)
        return label
    }()
    
    lazy var tertiaryLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.font = UIFont.preferredFont(forTextStyle: .callout)
        return label
    }()
    
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        setup()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setup() {
        contentView.addSubview(primaryLabel)
        contentView.addSubview(secondaryLabel)
        contentView.addSubview(tertiaryLabel)
        
        NSLayoutConstraint.activate([
            tertiaryLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
            tertiaryLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16),
            tertiaryLabel.heightAnchor.constraint(equalToConstant: 18),
            
            primaryLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
            primaryLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
            primaryLabel.heightAnchor.constraint(equalToConstant: 19),

            secondaryLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
            secondaryLabel.topAnchor.constraint(equalTo: primaryLabel.bottomAnchor, constant: 8),
            secondaryLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 12),
//            secondaryLabel.heightAnchor.constraint(equalToConstant: 15)
        ])
    }
}

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

private lazy var tableView: UITableView = {
    let tableView = UITableView(frame: view.bounds, style: .grouped)
    tableView.allowsSelection = false
    tableView.dataSource = self
    tableView.delegate = self
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = UITableView.automaticDimension
    tableView.register(CustomCell.self, forCellReuseIdentifier: CustomCell.identifier)
    return tableView
}()

Но ячейка по-прежнему выглядит так. С высотой по умолчанию. Несмотря на то, что у меня есть ограничения автоматической компоновки, расположенные сверху вниз. Я тоже не получаю предупреждений в консоли.

Есть идеи, что мне здесь не хватает?

enter image description here

Демо-проект

1 Ответ

1 голос
/ 21 июня 2020

Два наблюдения:

  1. Ваша вторичная метка должна иметь отрицательную константу в нижней части контейнера.

  2. Кроме того, ваша предполагаемая высота строки должно быть какое-то разумное фиксированное значение (например, 44 или что-то в этом роде ... оно не должно быть идеальным, а просто какое-то разумное значение, которое таблица может использовать для оценки высоты строк, которые еще не были представлены). Вы не не хотите использовать UITableView.automaticDimension для estimatedRowHeight, только для rowHeight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...