单击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 字体