6

我有 Tableview 用于显示客户下的食品订单。其中包含 Horizo​​ntal UIStackview。在UIStackView

UIStackview里面很少有一个/两个内衬标签和一个用于 UITableView显示 orderItems 的标签。内部 tableview 具有固定的高度常数(大于或等于 + 750 优先级),并将随内容大小而变化。高度和滚动禁用。

内表视图有两个标签。高度是自动尺寸

我希望主 tableview 单元格高度应该根据内部 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

}

内部 tableview 数据源数组

var orderData:[ODOrderDataMaster] = [] {
        didSet {
            self.tblOrderMaster.reloadData()
            self.layoutIfNeeded()
            self.const_Height_tblOrderMaster.constant = self.tblOrderMaster.contentSize.height
            self.layoutIfNeeded()

        }
    }

问题:当我滚动主表视图时,它没有根据子项正确调整大小。虽然最初它显示正确。

我几乎尝试过所有类似 layoutIfNeeded 的方法。布局子视图。设置需求显示。

我也实现了 willDisplayCell 但没有成功。

我认为问题是当我重新加载内部表格视图时。当它完成重新加载时,我如何通知主 tableview 以及如何更新内部 tableview 的高度常数

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

我感谢任何帮助或建议

4

4 回答 4

1

在 main & inner tableViews 的 cellForRowAt 末尾添加这两行

  cell.layoutSubviews()

  cell.layoutIfNeeded()

  return cell

您也可以尝试在主单元子类中添加layoutSubviews方法并执行此操作

  self.tblOrderMaster.layoutIfNeeded()

并在主 tableView 的控制器的viewDidLayoutSubviews中执行此操作

  self.tblOrders.layoutIfNeeded()
于 2017-12-30T09:20:48.800 回答
1

尝试将此添加到 tblOrders :

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.contentView.setNeedsLayout()
    cell.contentView.layoutIfNeeded()
}
于 2018-06-19T16:20:17.140 回答
1

我已经尝试了几乎所有可能的解决方案,但每个都有一些问题。所以我找到了另一种解决方法来解决这个问题它不能被称为完美的解决方案,但是它对我有用

在 tableview 单元格中,我添加了一个隐藏标签 ,它是顶部: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 单元格将随之增长。

希望它对面临同样问题的人有所帮助如果你们中的任何人都可以发布另一个可行的解决方案,我会很乐意接受它:)

于 2018-06-20T05:15:37.523 回答
1

你为什么不根据内部 tableView 的行数来做,例如假设你的内部 tableview 的 rowheight 为 30 点,而不是设置 parenttableview rowheight 你所要做的就是将子 tableview 的行数乘以rowheight,你会得到你想要的。

于 2018-06-25T10:57:18.460 回答