单击Swift 4中的自定义按钮时调整单元格大小

Posted

技术标签:

【中文标题】单击Swift 4中的自定义按钮时调整单元格大小【英文标题】:Resize cell when click on custom button in Swift 4 【发布时间】:2018-01-01 10:33:30 【问题描述】:

我有一个视图控制器,我在其中使用了表视图控制器。在我的单元格中有一个按钮,当用户单击该按钮时,单元格大小应变为 550,再次单击时应返回其原始高度。我在搜索后尝试了位代码,但它不起作用是他们任何可以为我工作的解决方案吗?我的代码有点这个,

var indexOfCellToExpand: Int!

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
  if indexPath.row == indexOfCellToExpand 
    return 170 + expandedLabel.frame.height - 38
  
  return 170

【问题讨论】:

使用两个不同的单元格,一个用于展开项,一个用于折叠项 显示你的按钮操作方法 Programmatically creating an expanding UItableViewCell的可能重复 我还没有在按钮操作中编写任何代码。 @PrashantTukadiya 多余的空间里会有什么?如果您使用动态大小的单元格,您可以在单元格中放置一个 UIStackView,然后显示/隐藏额外的视图。 【参考方案1】:

对展开-折叠单元格使用自动布局, 附上那个案例的 Demo

链接:https://www.dropbox.com/s/ieltq0honml35l8/TAbleDemo.zip?dl=0.

在选择-取消选择事件上设置单元格按钮高度约束和更新值约束并重新加载数据

在主视图控制器代码中

self.tblView.estimatedRowHeight = 100
self.tblView.rowHeight = UITableViewAutomaticDimension

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 3
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "TblCell", for: indexPath) as! TblCell

        cell.btnExpandCollepse.addTarget(self, action: #selector(ViewController.expandCollapse(sender:)), for: .touchUpInside)
        return cell

    

 @objc func expandCollapse(sender:UIButton) 

        self.tblView.reloadData()
    

单元类中的代码

@IBOutlet var btnExpandCollepse: UIButton!
@IBOutlet var constraintBtnHeight: NSLayoutConstraint!

@IBAction func onExpandCollepse(_ sender: UIButton) 

        sender.isSelected = !sender.isSelected

        if !sender.isSelected

            self.constraintBtnHeight.constant = 50
        else
            self.constraintBtnHeight.constant = 500
        
    

图片下的约束检查 http://prntscr.com/hur8ym

使用自动调整单元格的 Lable 自定义内容高度的更新演示 https://www.dropbox.com/s/o742kflg5yeofb8/TAbleDemo%202.zip?dl=0

https://www.dropbox.com/s/o742kflg5yeofb8/TAbleDemo%202.zip?dl=0

【讨论】:

为什么要重新加载整个表格视图?相反,重新加载您想要扩大或缩小的行【参考方案2】:

Swift 4.x

fileprivate var expandedIndexSet = Set<IndexPath>()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if expandedIndexSet.contains(indexPath) 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CELL_EXPANDED", for: indexPath) as! CellExpanded
        return cell
     else 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CELL_COLLAPSED", for: indexPath) as! CellCollapsed
        return cell
    


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    tableView.deselectRow(at: indexPath, animated: false)
    if expandedIndexSet.contains(indexPath) 
        expandedIndexSet.remove(indexPath)
     else 
        expandedIndexSet.insert(indexPath)
    
    tableView.reloadRows(at: [indexPath], with: .fade)

【讨论】:

必须将两个单元格放在一起? @SPatel 虽然您可以做到这一点,但您实际上并不需要这样做。您可以只使用动态大小的单元格,然后调整单元格内容的大小,它会改变它的高度。这允许更好的动画。根据您在单元格中想要的内容,UIStackView 可能是要走的路。 @HamzaImran 只需在 tableView(:UITableView, cellForRowAt: ) 方法中有条件地返回单元格类型并在单击事件简单时重新加载单元格 如果可能的话也使用自己大小的tableview

以上是关于单击Swift 4中的自定义按钮时调整单元格大小的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 中的 UIImageView 在单击时调整大小

使用自动布局在屏幕更改时调整自定义单元格中的 UIButton 字体

Swift - 处理表格视图多个部分的自定义复选标记按钮状态

swift中的自定义集合视图单元格

在自定义单元格 Swift 中保存 uibutton 状态

选择时调整单元格大小时出现 NSAutoResizingMaskLayoutConstraint 错误