TableView内的TableView自动维度表视图

时间:2017-12-30 07:35:57

标签: ios swift uitableview uitableviewautomaticdimension

我有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的高度常量

如果有人需要更多信息,请告诉我。

我感谢任何帮助或建议

4 个答案:

答案 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

enter image description here

现在

    // 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,您将确切地得到所需的内容。