UITableViewCell 自定义类 - 更改子视图高度约束后重新加载单元格高度

Posted

技术标签:

【中文标题】UITableViewCell 自定义类 - 更改子视图高度约束后重新加载单元格高度【英文标题】:UITableViewCell custom class - Reload cell height after change in subview height constraint 【发布时间】:2017-10-05 10:24:55 【问题描述】:

我在自定义 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 并重新访问单元格时,它的高度才会更新。

【问题讨论】:

我已经实现了与你的非常相似的东西,但我所要做的就是“self.tableView.beginUpdates() self.tableView.endUpdates()”。请试一试 @Siyavash : 我在 UITableViewCell 自定义类中写了上面的内容 哦,这可能就是为什么,我会写一个可能的解决方案 @Siyavash :从 UITableViewCell 类中也很容易做到这一点。但我担心这是否是正确的做法。 但是在“滚动 UITableView 并重新访问单元格”之前,“单元格的高度保持不变”的原因可能是因为您的表格视图仍在使用旧单元格 【参考方案1】:

将以下方法添加到viewControllertableView 以在单元格展开时刷新表格:

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

在约束更新后调用该方法。如果按钮操作单元格内的约束,您需要将更改通知viewController,以便您可以调用该方法。使用委托模式(或直接将 tableView 引用传递给每个可扩展单元格 - 只需记住将其存储为 weak 变量),或使用 NotificationCenter.default 发布通知。

【讨论】:

【参考方案2】:

由于此代码在 TableViewCell 中,您需要在 TableViewController 中为您的单元格创建一个操作方法,以便在单击按钮时知道。您可以在 tableviewCell 中保留对按钮的引用,然后在单元格 cellForRowAt 中保留您可以执行的操作

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

并创建一个名为“expandButtonTapped”的函数并添加tableview beign并在那里结束更新

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



请让我知道这是否有效

【讨论】:

以上是关于UITableViewCell 自定义类 - 更改子视图高度约束后重新加载单元格高度的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 不保存自定义按钮的状态

无法更改 UITableViewCell 内的 UIButton 图像

创建自定义 UITableViewCell

当 UITextField 获得焦点时,从 UITableViewCell 继承类中更改 UITableViewCell 的高度

在 UITableViewCell 中更改大小类时的 UIStackView 布局问题

更改 uitableviewcell 中的自定义附件视图?