Увеличение высоты пользовательского представления в строке табличного представления (и, как следствие, в строке тоже) программным способом - PullRequest
1 голос
/ 12 октября 2019

У меня есть представление (позже, называемое пользовательским представлением), которое отображает внутри него подпредставления. После их рендеринга я получаю новое требуемое значение высоты (чтобы все подпредставления были видны) и пытаюсь обновить высоту вида. Вот код, вызываемый из awakeFromNib() метода подкласса UITableViewCell (Примечание: в приведенном ниже коде используется ReactiveSwift):

customView.model.requiredHeight.producer
        .observe(on: UIScheduler())
        .skipNil()
        .skipRepeats()
        .startWithValues { [weak self] in
            print("increased Height: ", $0)

            self?.customViewHeightConstraint.constant += $0

            print("customView height: ", self?.customView.frame)
    }

Итак, правильная высота, которая будет добавлена ​​кограничение захватывается, и первый оператор печати подтверждает это. Однако это не меняет вид. Последнее выражение print показывает, что даже если я добавлю значение к ограничению высоты представления, его кадр будет таким же.

Я должен отметить, что это так называемое пользовательское представление находится внутри строки UITableView. Вот схема (зеленый прямоугольник - это ячейка, желтый - UILabel, а красный - вид):

enter image description here

Итак, все прижато к краям. Я использую автоматическую высоту строки для строки (однако без разницы, если я установил ее на пользовательский) и в методе делегата табличного представления tableView(_:estimatedHeightForRowAt:) возвращает UITableView.automaticDimension в качестве расчетной высоты.

Я уверен, что япропустить что-то очевидное, но не могу понять, честно. Этот метод отлично работает, если пользовательское представление не находится внутри ячейки, поэтому, я думаю, это как-то связано с ячейкой табличного представления.

1 Ответ

1 голос
/ 12 октября 2019

Вы все сделали правильно, и ваши ограничения верны, но табличное представление не слышало о том, что они изменились. Вам необходимо перезагрузить табличное представление (или хотя бы эту строку).

Между прочим, лучший способ сделать это - выполнить пустое пакетное обновление, поскольку это приведет кизменение в анимированном , что очень красиво выглядит.

РЕДАКТИРОВАТЬ: Я говорю «ваши ограничения верны», но комментарий, который вы позжедобавил, предполагает, что это не так. Звучит так, как будто вы пытаетесь «смешать и сопоставить» фиксированный макет с помощью автоматического размещения: ваш пользовательский вид использует автоматический выбор, а его подпредставления - нет. Не делайте этого.

Вместо того, чтобы вручную изменять ограничение высоты вашего пользовательского представления, вы должны использовать внутренние ограничения для всех подпредставлений, чтобы их ограничения определяли размер пользовательского представления изнутри - точно втак же, как сама клетка работает. Либо так, либо вы должны отключить автоматическое изменение размера ячейки и реализовать heightForRowAt, чтобы диктовать всю высоту ячейки вручную .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...