Это может быть достигнуто с помощью UIStackview. Вот пример кода для контроллера представления, у которого есть табличное представление, каждая строка которого может показать 1, 2 или 3 метки. Метод источника данных cellForRow имеет логику для переключения числа меток в соответствии с требованием.
import UIKit
class ViewController: UIViewController {
// This array contains the sample data to populate the tableview. Each
element dictates the number of labels to be shown in the cell
var tableData = [1,2,3,2,3,2]
}
extension ViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section:
Int) -> Int {
return tableData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "LabelRow",
for: indexPath) as! LabelTableViewCell
let labelCount = tableData[indexPath.row]
// Check the label count for the current row to decide how many labels to show.
// Extra lables are hidden
switch labelCount {
case 1:
cell.label1.isHidden = false
cell.label2.isHidden = true
cell.label3.isHidden = true
case 2:
cell.label1.isHidden = false
cell.label2.isHidden = false
cell.label3.isHidden = true
default:
cell.label1.isHidden = false
cell.label2.isHidden = false
cell.label3.isHidden = false
}
return cell
}
}
Класс LabelTableViewCell является подклассом UITableViewCell и содержит UIStackView. Представление стека решает задачу размещения меток по вертикали. Кроме того, поскольку одна или несколько меток (которые добавляются как упорядоченные подпредставления представления стека в Интерфейсном Разработчике) скрыты, высота представления стека корректируется. Хитрость заключается в том, чтобы иметь ограничения между вершиной стека и верхней частью представления содержимого ячейки и аналогичными нижними ограничениями. Это гарантирует, что при изменении высоты стека высота ячейки также изменяется соответственно.
Я добавил проект в GitHub для лучшего понимания
Вот скриншот с результатом.