UITableViewAutomaticDimension, получить ту же высоту, если текст detailTextLabel равен нулю - PullRequest
0 голосов
/ 10 января 2020

Я использую UITableViewAutomaticDimension с ячейками со стилем субтитров.

Когда в detailTextLabel нет текста, эти строки кажутся меньше, что ожидается по умолчанию.

Однако как это не желательно, каким будет способ переопределить это, кроме использования пользовательской ячейки?

Я слышал об установке ограничения высоты (в данном конкретном случае это должно быть установлено в коде ), но мне это не удалось.

1 Ответ

1 голос
/ 11 января 2020

Если ваша цель состоит в том, чтобы все высоты строк были одинаковыми, с textLabel по центру по вертикали, когда нет текста для detailTextLabel, вы можете выполнить sh это с помощью ячейки Subtitle по умолчанию, добавив эта строка в viewDidLoad():

tableView.rowHeight = 56

Редактировать

Эта опция не совместима с Dynami c Тип - это бросает немного ключ к выполнению задачи.

Один подход - это своего рода обходной путь, но он сделает свою работу:

  • Пользовательская ячейка
  • Начните с укладки это с надлежащими ограничениями, чтобы (близко) соответствовать ячейке субтитров по умолчанию
  • Дублировать метку «Заголовок»
  • Ограничить, чтобы дубликат метки был вертикально центрирован в ячейке

Затем, если ваши данные имеют , имеют текст субтитров, покажите метки заголовка и субтитров и скройте «дубликат» метки заголовка.

Если ваши данные НЕ имеет текст субтитров, скрывает заголовок и метки субтитров и показывает «дубликат» метка заголовка.

Вот простой пример, который вы можете попробовать:

class MySubtitleCell: UITableViewCell {

    let myTextLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.font = UIFont.preferredFont(forTextStyle: .title1)
        return v
    }()

    let myCenteredTextLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.font = UIFont.preferredFont(forTextStyle: .title1)
        return v
    }()

    let myDetailTextLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.font = UIFont.preferredFont(forTextStyle: .subheadline)
        return v
    }()

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

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }

    func commonInit() -> Void {

        contentView.addSubview(myTextLabel)
        contentView.addSubview(myCenteredTextLabel)
        contentView.addSubview(myDetailTextLabel)

        let g = contentView.layoutMarginsGuide

        NSLayoutConstraint.activate([

            myTextLabel.topAnchor.constraint(equalTo: g.topAnchor, constant: 7.0),
            myTextLabel.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),

            myDetailTextLabel.topAnchor.constraint(equalTo: myTextLabel.bottomAnchor, constant: 0.0),
            myDetailTextLabel.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),
            myDetailTextLabel.bottomAnchor.constraint(equalTo: g.bottomAnchor, constant: -7.0),

            myCenteredTextLabel.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),
            myCenteredTextLabel.centerYAnchor.constraint(equalTo: g.centerYAnchor, constant: 0.0),

        ])

        // during development, un-comment this block
        // to give labels background colors so we can see their frames
        /*
        myTextLabel.backgroundColor = .cyan
        myDetailTextLabel.backgroundColor = .green
        myCenteredTextLabel.backgroundColor = .yellow
        */

    }

}

class DetailTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(MySubtitleCell.self, forCellReuseIdentifier: "MySTCell")
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        var detailStr = "The detail text string"

        // set detailStr empty for every-other row
        if indexPath.row % 2 == 0 {
            // set it to a space char " " instead of "" to maintain label frame
            detailStr = " "
        }

        let cell = tableView.dequeueReusableCell(withIdentifier: "MySTCell", for: indexPath) as! MySubtitleCell

        // set same text for myTextLabel and myCenteredTextLabel
        cell.myTextLabel.text = "Row: \(indexPath.row)"
        cell.myCenteredTextLabel.text = cell.myTextLabel.text

        // set myDetailTextLabel
        cell.myDetailTextLabel.text = detailStr

        // if detailStr is not empty (" ")
        //  hide myTextLabel and myDetailTextLabel and show myCenteredTextLabel
        // else
        // show myTextLabel and myDetailTextLabel and hide myCenteredTextLabel

        cell.myTextLabel.isHidden = (detailStr == " ")
        cell.myDetailTextLabel.isHidden = cell.myTextLabel.isHidden
        cell.myCenteredTextLabel.isHidden = !cell.myTextLabel.isHidden

        return cell

    }

}

Результаты (все остальные строки не имеют подробного текста метки) ...

С размерами шрифта «по умолчанию»:

enter image description here

и тем же экраном, с большими шрифтами через Accessibility / Dynami c Тип:

enter image description here

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