Ответ
UIStackView — это контейнер для компоновки (layout), который автоматически управляет расположением своих дочерних вью по горизонтали или вертикали.
UITableView — это вид для отображения прокручиваемых списков данных, оптимизированный для работы с большими наборами элементов.
Сравнительная таблица
| Характеристика | UIStackView | UITableView |
|---|---|---|
| Основное назначение | Управление layout статичного набора вью | Отображение динамических, прокручиваемых списков данных |
| Скроллинг | Не поддерживает. Для скролла нужно поместить в UIScrollView. |
Нативная поддержка вертикального (и горизонтального) скролла. |
| Оптимизация памяти | Нет. Все дочерние вью загружаются сразу. | Есть. Механизм переиспользования ячеек (dequeueReusableCell). |
| Структура данных | Простая линейная (массив arrangedSubviews). |
Сложная (секции, строки, заголовки, футеры). |
| Динамическое изменение | Легко добавлять/удалять вью, анимация распределения. | Требует обновления данных через insertRows, deleteRows и т.д. |
Пример использования UIStackView
// Создание вертикального стека с отступами
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 10
stackView.alignment = .fill
stackView.distribution = .fillEqually
// Добавление вью
let label = UILabel()
label.text = "Заголовок"
let button = UIButton(type: .system)
button.setTitle("Кнопка", for: .normal)
stackView.addArrangedSubview(label)
stackView.addArrangedSubview(button)
// Для скролла помещаем стек в UIScrollView
let scrollView = UIScrollView()
scrollView.addSubview(stackView)
// ... настройка constraints для stackView внутри scrollView
Пример использования UITableView
class MyViewController: UIViewController, UITableViewDataSource {
let tableView = UITableView()
let data = ["Элемент 1", "Элемент 2", "Элемент 3"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.dataSource = self
view.addSubview(tableView)
// ... настройка frame/constraints
}
// Обязательный метод data source
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
// Обязательный метод data source с переиспользованием ячейки
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = data[indexPath.row]
return cell // Ячейка конфигурируется и возвращается
}
}
Когда что использовать?
UIStackView: Для статичных форм, групп кнопок, вертикальных/горизонтальных блоков интерфейса, где элементы известны на этапе компиляции.UITableView: Для отображения списков контактов, лент новостей, любых данных, количество которых может меняться и потенциально велико.