Есть экран (UIViewController
) со столом (UITableView
). Ячейки для таблицы определены в отдельных MyCell.xib
. Структура ячейки в Интерфейсном Разработчике довольно стандартна:
MyCell
SafeArea
ContentView
Container
Views, Labels, etc
Я использую автоматическое расположение, а для Container
горизонтальные ограничения равны
Container.Leading = SuperView.Leading Margin
SuperView.Trailing Margin = Container.Trailing
Эти поля рассчитываются автоматически iOS, и, как я вижу, например, для iPhone 11 Pro они равны 20, а для iPhone 5 они равны 8. Все выглядит хорошо, ячейки в таблице имеют хорошие поля, и я не хочу вмешиваться в то, как выглядит таблица.
Теперь мне нужно добавить кнопку на экран, и ширина кнопки должна быть равна ширине ячеек таблицы (т.е. ширине ячейки Container
). Кнопка находится на том же уровне иерархии в контроллере представления, что и таблица (то есть кнопка и таблица являются родственными элементами).
Проблема заключается в том, что мне нужно установить правильную ширину для кнопки, прежде чем таблица будет заполнена ячейками (они добавляются / удаляются из таблицы динамически).
Я пытался предварительно загрузить xib ячейки и вычислить поле ContentView
, но когда ячейка добавляется в таблицу, поле изменилось:
override func viewDidLoad() {
super.viewDidLoad()
let cell = Bundle.main.loadNibNamed(cellId, owner: nil, options: nil)?.first as! MyCell
cell.setNeedsLayout()
cell.layoutIfNeeded()
let leftMargin = cell.contentView.layoutMargins.left // = 8 <- incorrect
myButtonLeftMarginConstraint.constant = leftMargin
... чуть позже:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! MyCell
let leftMargin = cell.contentView.layoutMargins.left // = 20 <- correct value
myButtonLeftMarginConstraint.constant = leftMargin // too late, button already visible
Итак, вопрос в том, как заранее узнать, какое поле (SuperView.Leading Margin
) будет использоваться для содержимого ячейки таблицы до того, как ячейка будет фактически добавлена в стол.