UIStackView с многострочной меткой в ​​UITableViewCell неверной высоты - PullRequest
0 голосов
/ 16 мая 2019

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

Проблема, с которой я столкнулся, заключается в том, что вокруг субтитров в ячейках, которые имеют заголовок, имеется большое вертикальное расстояние.

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

Ожидаемое поведение :

enter image description here

Фактическое поведение :

enter image description here

Ячейка в основном имеет UIStackView, прикрепленную к ячейке contentView.

import UIKit

public class TableViewCellSubtitle: UITableViewCell {

    private lazy var labelStack: UIStackView = {
        let labelStack = UIStackView()
        labelStack.alignment = .fill
        labelStack.distribution = .fillProportionally
        labelStack.axis = .vertical
        return labelStack
    }()

    private lazy var titleLabel: UILabel = {
        let titleLabel = UILabel()
        titleLabel.backgroundColor = UIColor.blue.withAlphaComponent(0.3)
        return titleLabel
    }()

    private lazy var subtitleLabel: UILabel = {
        let subtitleLabel = UILabel()
        subtitleLabel.numberOfLines = 0
        subtitleLabel.backgroundColor = UIColor.green.withAlphaComponent(0.3)
        return subtitleLabel
    }()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        setupUI()
        setupConstraints()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupUI() {

        contentView.addSubview(labelStack)
        labelStack.translatesAutoresizingMaskIntoConstraints = false
        labelStack.addArrangedSubview(titleLabel)
        labelStack.addArrangedSubview(subtitleLabel)

    }

    private func setupConstraints() {
        NSLayoutConstraint.activate([
                labelStack.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
                labelStack.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
                contentView.bottomAnchor.constraint(equalTo: labelStack.bottomAnchor, constant: 12),
                contentView.trailingAnchor.constraint(equalTo: labelStack.trailingAnchor, constant: 16)
            ])
    }

    public func setup(title: String?, subtitle: String) {
        titleLabel.text = title
        if title == nil {
            labelStack.removeArrangedSubview(titleLabel)
            titleLabel.removeFromSuperview()
        }
        subtitleLabel.text = subtitle
    }
}

Я попытался установить обтекание контентом для субтитров

subtitleLabel.setContentHuggingPriority(.required, for: .vertical)

но заголовок увеличивается:

enter image description here

Если я установлю оба значения:

titleLabel.setContentHuggingPriority(.required, for: .vertical)
subtitleLabel.setContentHuggingPriority(.required, for: .vertical)

становится

enter image description here

Во всех случаях, если я перезагружаю ячейку или табличное представление, компоновка становится правильной (здесь при нажатии на ячейку):

enter image description here

Я знаю, что могу расположить ячейку без использования стека, но моя реальная реализация немного сложнее

1 Ответ

0 голосов
/ 16 мая 2019
  • Попробуйте с заполнением вместо пропорционального заполнения
  • Или попробуйте установить label.sizeToFit (), чтобы свернуть ярлык до размера его содержимого
...