我有Tableview用于显示客户提供的食品订单。其中包含水平UIStackview
。在UIStackView
在UIStackview
中,有一个/两个有衬里的标签和一个UITableView
,用于显示orderItems。内部tableview具有固定的高度常数(大于或等于+ 750优先级)并且将是
随内容大小而变化。高度和滚动禁用。
内部tableview有两个标签。和高度是自动维度
我想要根据内部tableview项自动增加主tableview单元格高度。所以我申请到主要的tableview
self.tblOrders.rowHeight = UITableViewAutomaticDimension
self.tblOrders.estimatedRowHeight = 45
和in 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
}
内部tableview数据源数组
var orderData:[ODOrderDataMaster] = [] {
didSet {
self.tblOrderMaster.reloadData()
self.layoutIfNeeded()
self.const_Height_tblOrderMaster.constant = self.tblOrderMaster.contentSize.height
self.layoutIfNeeded()
}
}
问题:当我滚动主表视图时,它没有根据子项正确调整大小。最初它显示正确。
我几乎尝试过像layoutIfNeeded这样的东西。 layoutSubviews。 setNeedsDisplay。
我也实现了willDisplayCell但没有成功。
我认为问题是当我重新加载内部tableview时。当它完成重新加载时如何通知主表视图以及如何更新内部tableview的高度常量
如果有人需要更多信息,请告诉我。
我感谢任何帮助或建议
答案 0 :(得分:1)
在main&中的cellForRowAt结尾之前添加这两行。内部tableViews
cell.layoutSubviews()
cell.layoutIfNeeded()
return cell
您也可以尝试在主细胞子类中添加 layoutSubviews 方法并执行此操作
self.tblOrderMaster.layoutIfNeeded()
并在主tableView的控制器的 viewDidLayoutSubviews 中执行此操作
self.tblOrders.layoutIfNeeded()
答案 1 :(得分:0)
尝试将其添加到tblOrders中:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.contentView.setNeedsLayout()
cell.contentView.layoutIfNeeded()
}
答案 2 :(得分:0)
我尝试了几乎所有可能的解决方案,但每个解决方案都有一些问题。因此,我找到了另一种解决方法来解决此问题,它不能称为完美解决方案,但是它对我有用
在表格视图单元格中,我添加了一个隐藏标签,即顶部: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
这里要做的是,内部tableview的单元格具有随文本而增长的标签。因此,在我的情况下,该临时标签具有相同的文本(masterSubitem
),简而言之,我在该标签中复制了内部tableview单元,因为我们提供了所有四个约束来进行标签,因此,当它增长时,tableview单元将随着它。
希望这对面临相同问题的人有所帮助。如果你们中的任何人都可以发布其他可行的解决方案,我会很乐意接受:)
答案 3 :(得分:0)
例如,为什么不基于内部tableView的行数来执行此操作,假设您的内部tableview的行高为30点,而不是设置parenttableview rowheight,您要做的就是乘以子级的行数通过rowheight进行tableview,您将确切地得到所需的内容。