UITableViewCell пользовательский класс - перезагрузить высоту ячейки после изменения ограничения высоты подпредставления

У меня есть кнопка в кастом UITableViewCell учебный класс. Показывает / скрывает вид (часть одной ячейки). Высота клетки должна измениться при этом.
Это действие кнопки (в UITableViewCell пользовательский класс):

@IBAction func showHideCartView(sender: UIButton)
    {
        if sender.tag == 1
        {
            // Show cart view
            self.buttonArrow.tag = 2
            self.viewAddToCart.isHidden = false
            self.constraint_Height_viewAddToCart.constant = 50
            self.buttonArrow.setImage(UIImage(named: "arrowUp.png"), for: .normal)
        }
        else
        {
            // Hide cart view
            self.buttonArrow.tag = 1
            self.viewAddToCart.isHidden = true
            self.constraint_Height_viewAddToCart.constant = 0
            self.buttonArrow.setImage(UIImage(named: "arrowDown.png"), for: .normal)
        }

        self.setNeedsUpdateConstraints()
        self.setNeedsLayout()
        self.layoutIfNeeded()
    }  

Высота ячейки остается неизменной. Только когда я прокручиваю UITableView и снова посещаю ячейку, ее высота обновляется.

2 ответа

Решение

Добавьте следующий метод к viewController с tableView обновить таблицу при расширении ячейки:

func refreshTableAfterCellExpansion() {
    self.tableView.beginUpdates()
    self.tableView.setNeedsDisplay()
    self.tableView.endUpdates()
}

Вызовите метод после того, как ограничения были обновлены. Если кнопка управляет ограничениями внутри ячейки, вам необходимо уведомить viewController об изменении, чтобы вы могли вызвать метод. Либо используйте шаблон делегата (или передайте непосредственно tableView ссылка на каждую расширяемую ячейку - просто не забудьте сохранить ее как weak переменная), или опубликовать уведомление, используя NotificationCenter.default,

Поскольку этот код находится в TableViewCell, вам необходимо создать метод действия для вашей ячейки в TableViewController, чтобы при нажатии кнопки вы знали. Вы можете сохранить ссылку на свою кнопку в таблице viewCell, а затем внутри ячейки cellForRow.

cell.yourButtonRef.addTarget(self, action: #selector(expandButtonTapped(_:)), for: .touchDown)

и сделать функцию с именем "expandButtonTapped" и добавить beign таблицы и завершить там обновление

@objc func expandButtonTapped(_ button: UIButton) {
    self.tableView.beginUpdates() 
    self.tableView.endUpdates()


}

Пожалуйста, дайте мне знать, сработало ли это или нет

Другие вопросы по тегам