【发布时间】:2019-11-04 04:14:09
【问题描述】:
我有一个 UITableView,它已作为视图控制器的一部分添加到 UIScrollView 中,该控制器遵循如下所示的模型的一部分:-
正如您在模型中看到的,UITableView 位于标签“特色企业”标签和包含绿色和粉红色子视图的视图之间
此外,如果观察到,表格视图中的每个单元格都有一个按钮,单击该按钮可切换包含详细信息列表的卡片视图。卡片视图的高度取决于详细信息的数量。
我可以扩展和收缩单元格以显示卡片视图,它是模型中所示的表格视图单元格的一部分。
问题在于扩展和收缩父表格视图,以便看到该表格视图中的所有单元格(表格视图不应该是可滚动的,并且任何单元格都不应该被隐藏) 并且只有滚动视图是可滚动的。
这是我的表格视图单元格代码,其中涉及单元格的扩展以及更改表格的尺寸(高度)和滚动视图的内容大小:-
func toggleBusinessesTable() {
var businessTableHeight = self.parent!.businessTable.frame.height
if self.parent!.indexOfCellToExpand > -1 {
self.parent!.businessTable.snp.remakeConstraints { (make) in
make.top.equalTo(self.parent!.featuredBusinessesHeading.snp.bottom).offset(3.5)
make.left.equalTo(self.parent!.scroll.snp.left)
make.width.equalTo(self.parent!.view.bounds.width)
make.height.equalTo(CGFloat(businessTableHeight) + CGFloat(self.tableHeight))
}
self.parent!.scroll.layoutIfNeeded()
self.parent!.scroll.contentSize.height = self.parent!.usersCollectionView.frame.maxY + 75
}
else if self.parent!.indexOfCellToExpand == -1 {
self.parent!.businessTable.snp.remakeConstraints { (make) in
make.top.equalTo(self.parent!.featuredBusinessesHeading.snp.bottom).offset(3.5)
make.left.equalTo(self.parent!.scroll.snp.left)
make.width.equalTo(self.parent!.view.bounds.width)
make.height.equalTo(CGFloat(businessTableHeight) - CGFloat(self.tableHeight))
}
self.parent!.scroll.layoutIfNeeded()
self.parent!.scroll.contentSize.height = self.parent!.usersCollectionView.frame.maxY + 75
}
}
func expandCell(_ sender: UI.Button) {
if self.parent!.indexOfCellToExpand != self.tag {
print("EXPANDING...")
self.parent!.indexOfCellToExpand = self.tag
self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
}
else if self.parent!.indexOfCellToExpand == self.tag {
print("CONTRACTING...")
self.parent!.indexOfCellToExpand = -1
self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
}
// self.toggleBusinessesTable()
}
parent 是具有滚动视图和表格视图的视图控制器
businessTable 是 UITableView 是有问题的表,scroll 是保存表视图的 UIScrollView
我正在使用表格视图单元格的标签来跟踪indexPath
下面的代码计算表格视图单元格应该扩展的差异:-
// tableHeight is initially 0 at the beginning
if self.business_service_charges.count <= 4 {
for each in self.business_service_charges {
self.tableHeight += 80 + each.sub_service_charges.count*80
}
} else if self.business_service_charges.count > 4 {
for each in self.business_service_charges[0...3] {
self.tableHeight += 80 + each.sub_service_charges.count*80
}
}
表格视图单元格的tableHeight 变量用于计算表格视图应展开/收缩的程度。
但是在执行self.toggleBusinessesTable() 时,表格视图的扩展超过了它应该扩大的范围,在底部视图和表格视图之间增加了多余的间距,并且在收缩时,表格视图变得更小,隐藏了其他单元格,使表格视图可滚动。
大小的 UITableView 例程:-
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == indexOfCellToExpand {
var tableHeight = 0
if self.featuredBusinesses[indexPath.row].businessServiceCharges.count <= 4 {
for each in self.featuredBusinesses[indexPath.row].businessServiceCharges {
tableHeight += 80 + each.sub_service_charges.count*80
}
} else if self.featuredBusinesses[indexPath.row].businessServiceCharges.count > 4 {
for each in self.featuredBusinesses[indexPath.row].businessServiceCharges[0...3] {
tableHeight += 80 + each.sub_service_charges.count*80
}
}
return CGFloat(250 + tableHeight)
}
return 250
}
indexOfCellToExpand 是一个变量,用于跟踪已展开的表格视图单元格
简而言之,有没有什么办法可以展开和折叠table view,并适当改变scroll view的内容大小,以获得作为mockup的预期效果?
任何帮助将不胜感激。
另外,我用snapkit设置了单元格的布局
【问题讨论】:
-
你为什么还要在另一个
scrollView中添加scrollView(tableView)? -
@PGDev 我需要展示的企业数量可能会有所不同。我需要一个表格视图来处理它。如果有更好的方法来获得模拟中显示的 UI,请分享。
-
@PGDev 这只是我刚刚展示的模型的一部分。显示的模拟上方和下方还有更多视图
标签: ios swift uitableview uiscrollview snapkit