Вертикальный UIStackView: как сохранить одинаковое пространство между элементами и центрировать их?

#ios #swift #uikit #uistackview

Вопрос:

У меня есть представление таблицы с каждой ячейкой, содержащей вертикальный UIStackView, и я хотел бы центрировать все элементы внутри этого представления стека с расстоянием 8 пикселей между каждым из них. Вот визуально то, чего я хотел бы достичь:

введите описание изображения здесь

Но вот что я получаю до сих пор:

введите описание изображения здесь

И код, который я пробовал:

В делегате UITableView

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TVCell", for: indexPath) as! TVCell
        (0...indexPath.row).forEach { i in
            let label = UILabel()
            label.text = "Label #(i)"
            cell.stackView.addArrangedSubview(label)
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        5
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        180
    }
 

TVCell

 class TVCell: UITableViewCell {
    @IBOutlet weak var stackView: UIStackView!
}
 

введите описание изображения здесь

Что я должен сделать, чтобы получить ожидаемый результат?

Спасибо вам за вашу помощь

Комментарии:

1. Попробуйте установить рамку этикетки на все пространство, которое она занимает.

Ответ №1:

Поскольку вы используете фиксированную высоту для строк, вы хотите расположить представление стека в ячейке по вертикали:

введите описание изображения здесь

Свойства представления стека:

введите описание изображения здесь

и, дайте представлению стека Внутренний заполнитель высоты, чтобы избежать жалоб от построителя интерфейса:

введите описание изображения здесь

Обратите внимание, что вы захотите изменить свой cellForRowAt код… Ячейки используются повторно, и в нынешнем виде вы будете добавлять все больше и больше меток в каждую ячейку по мере прокрутки вверх и вниз.

Один метод (это было бы плохой практикой, но он работает для понимания вашей проблемы с макетом):

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TVCell", for: indexPath) as! TVCell
    
    // remove existing labels
    cell.stackView.arrangedSubviews.forEach {
        $0.removeFromSuperview()
    }
    
    (0...indexPath.row).forEach { i in
        let label = UILabel()
        label.text = "Label #(i)"
        cell.stackView.addArrangedSubview(label)
    }
    return cell
}
 

и вот как это выглядит:

введите описание изображения здесь введите описание изображения здесь