Сделайте кнопку такой же ширины, как ячейки таблицы - PullRequest
0 голосов
/ 20 марта 2020

Есть экран (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) будет использоваться для содержимого ячейки таблицы до того, как ячейка будет фактически добавлена ​​в стол.

...