TableView 自动维度 Tableview Inside Tableview
TableView Automatic Dimension Tableview Inside Tableview
我有 Tableview 用于显示客户下的食品订单。其中包含水平 UIStackview
。在UIStackView
在UIStackview
中很少有一/两行标签和一个UITableView
用于显示订单项。内表视图具有固定的高度常量(大于或等于 + 750 优先级)并且将是
随内容大小而变化。高度和滚动禁用。
inner tableview 有两个标签。 heigh 是自动维度
我希望主 tableview 单元格的高度应该根据内部 tableview 项目自动增加。所以我申请主表视图
self.tblOrders.rowHeight = UITableViewAutomaticDimension
self.tblOrders.estimatedRowHeight = 45
和在 tableview 单元格子类中
override func awakeFromNib() {
super.awakeFromNib()
self.tblOrderMaster.dataSource = self
self.tblOrderMaster.delegate = self
self.tblOrderMaster.estimatedRowHeight = 45
self.tblOrderMaster.rowHeight = UITableViewAutomaticDimension
self.selectionStyle = .none
self.layoutIfNeeded()
self.tblOrderMaster.isScrollEnabled = false
}
内部表视图数据源数组
var orderData:[ODOrderDataMaster] = [] {
didSet {
self.tblOrderMaster.reloadData()
self.layoutIfNeeded()
self.const_Height_tblOrderMaster.constant = self.tblOrderMaster.contentSize.height
self.layoutIfNeeded()
}
}
问题:当我滚动主表视图时,它没有根据 subitems.while 正确调整大小,最初它显示正确。
layoutIfNeeded 之类的我几乎都试过了。布局子视图。设置需要显示。
我也实现了 willDisplayCell 但没有成功。
我认为问题出在我重新加载内部表视图时。当它完成重新加载时,我如何通知主 tableview 以及如何更新内部 tableview 的高度常量
如果有人需要更多信息,请告诉我。
感谢任何帮助或建议
在 main 和 inner tableViews 的 cellForRowAt 结束前添加这两行
cell.layoutSubviews()
cell.layoutIfNeeded()
return cell
您也可以尝试在主单元格子类中添加 layoutSubviews 方法并执行此操作
self.tblOrderMaster.layoutIfNeeded()
并在主 tableView 的控制器的 viewDidLayoutSubviews 中执行此操作
self.tblOrders.layoutIfNeeded()
尝试将其添加到 tblOrders 中:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.contentView.setNeedsLayout()
cell.contentView.layoutIfNeeded()
}
我已经尝试了几乎所有可能的解决方案,但每一个都有一些问题。所以我找到了另一种解决方法来解决这个问题它不能称为完美的解决方案但是它对我有用
在表格视图单元格中,我添加了一个 隐藏标签,即顶部:0,底部:0,左侧:0,右侧:0
现在
// This is temp label which help to calulate height to tableview
if let orderMaster = restObj.orderDataMaster {
var tempText = ""
for orderMasterObject in orderMaster {
tempText += (orderMasterObject.item?.name ?? "") + "\n" + " "
if let subItems = orderMasterObject.masterSubitem {
let result = subItems.reduce("", { (result, subItem) -> String in
return result + (subItem.subitem?.name ?? "") + ","
})
tempText += result + "\n" + " "
}
tempText += "\n"
}
cell.lblTemp.text = tempText
}
self.view.layoutIfNeeded()
cell.setNeedsLayout()
cell.delegate = self
这里所做的是,Inner tableview 的单元格具有根据文本增长的标签。因此,在我的例子中,临时标签具有相同的文本 (masterSubitem
),简而言之,我已经在该标签中复制了内部 tableview 单元格,因为我们已经为标签提供了所有四个约束,所以当它增长时,我们的 tableview 单元格将随之增长它。
希望对面临相同问题的人有所帮助如果你们中的任何人可以 post 另一个可行的解决方案,我会很乐意接受:)
你为什么不根据内部 tableView 的行数来做呢?例如,假设你的内部 tableview 的行高为 30 点,而不是设置 parenttableview 的行高,你所要做的就是将行数乘以子表视图的行高,你会得到你想要的。
我有 Tableview 用于显示客户下的食品订单。其中包含水平 UIStackview
。在UIStackView
在UIStackview
中很少有一/两行标签和一个UITableView
用于显示订单项。内表视图具有固定的高度常量(大于或等于 + 750 优先级)并且将是
随内容大小而变化。高度和滚动禁用。
inner tableview 有两个标签。 heigh 是自动维度
我希望主 tableview 单元格的高度应该根据内部 tableview 项目自动增加。所以我申请主表视图
self.tblOrders.rowHeight = UITableViewAutomaticDimension
self.tblOrders.estimatedRowHeight = 45
和在 tableview 单元格子类中
override func awakeFromNib() {
super.awakeFromNib()
self.tblOrderMaster.dataSource = self
self.tblOrderMaster.delegate = self
self.tblOrderMaster.estimatedRowHeight = 45
self.tblOrderMaster.rowHeight = UITableViewAutomaticDimension
self.selectionStyle = .none
self.layoutIfNeeded()
self.tblOrderMaster.isScrollEnabled = false
}
内部表视图数据源数组
var orderData:[ODOrderDataMaster] = [] {
didSet {
self.tblOrderMaster.reloadData()
self.layoutIfNeeded()
self.const_Height_tblOrderMaster.constant = self.tblOrderMaster.contentSize.height
self.layoutIfNeeded()
}
}
问题:当我滚动主表视图时,它没有根据 subitems.while 正确调整大小,最初它显示正确。
layoutIfNeeded 之类的我几乎都试过了。布局子视图。设置需要显示。
我也实现了 willDisplayCell 但没有成功。
我认为问题出在我重新加载内部表视图时。当它完成重新加载时,我如何通知主 tableview 以及如何更新内部 tableview 的高度常量
如果有人需要更多信息,请告诉我。
感谢任何帮助或建议
在 main 和 inner tableViews 的 cellForRowAt 结束前添加这两行
cell.layoutSubviews()
cell.layoutIfNeeded()
return cell
您也可以尝试在主单元格子类中添加 layoutSubviews 方法并执行此操作
self.tblOrderMaster.layoutIfNeeded()
并在主 tableView 的控制器的 viewDidLayoutSubviews 中执行此操作
self.tblOrders.layoutIfNeeded()
尝试将其添加到 tblOrders 中:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.contentView.setNeedsLayout()
cell.contentView.layoutIfNeeded()
}
我已经尝试了几乎所有可能的解决方案,但每一个都有一些问题。所以我找到了另一种解决方法来解决这个问题它不能称为完美的解决方案但是它对我有用
在表格视图单元格中,我添加了一个 隐藏标签,即顶部:0,底部:0,左侧:0,右侧:0
现在
// This is temp label which help to calulate height to tableview
if let orderMaster = restObj.orderDataMaster {
var tempText = ""
for orderMasterObject in orderMaster {
tempText += (orderMasterObject.item?.name ?? "") + "\n" + " "
if let subItems = orderMasterObject.masterSubitem {
let result = subItems.reduce("", { (result, subItem) -> String in
return result + (subItem.subitem?.name ?? "") + ","
})
tempText += result + "\n" + " "
}
tempText += "\n"
}
cell.lblTemp.text = tempText
}
self.view.layoutIfNeeded()
cell.setNeedsLayout()
cell.delegate = self
这里所做的是,Inner tableview 的单元格具有根据文本增长的标签。因此,在我的例子中,临时标签具有相同的文本 (masterSubitem
),简而言之,我已经在该标签中复制了内部 tableview 单元格,因为我们已经为标签提供了所有四个约束,所以当它增长时,我们的 tableview 单元格将随之增长它。
希望对面临相同问题的人有所帮助如果你们中的任何人可以 post 另一个可行的解决方案,我会很乐意接受:)
你为什么不根据内部 tableView 的行数来做呢?例如,假设你的内部 tableview 的行高为 30 点,而不是设置 parenttableview 的行高,你所要做的就是将行数乘以子表视图的行高,你会得到你想要的。