#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
}
и вот как это выглядит: