0

我想使用自动布局来实现期望的行为(或者如果使用委托或其他东西无法做到这一点)。我拥有的是一个带有一个静态单元格的 tableView,这个单元格有一个 containerView,它有一个带有动态原型单元格的 tableViewController。

我想要的是能够使用自动布局来动态设置嵌入容器视图的静态单元格的高度。

这是故事板:

在此处输入图像描述

这些是我的约束(带有容器视图的 contentView 的静态单元格):

在此处输入图像描述

在静态单元格中拥有 containerView 的 viewController 中,我在ViewDidLoad方法上拥有的是:

override func viewDidLoad() {
    super.viewDidLoad()

    courseDetailTableView.estimatedRowHeight = 200
    courseDetailTableView.rowHeight = UITableViewAutomaticDimension
}

并将 tableView 的委托与 staticCell 一起使用:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

但是有了这个,静态单元格的高度真的很小......这意味着自动布局不能只用我设置的约束来设置他的内容的高度。我只说约束,因为如果我设置一个对将高度设置为 400 的 containerView 的 contentView 的更多约束,然后该单元格的高度为 400..

我只是想知道是否有自动布局的方法来设置静态单元格的高度以匹配 containerView 的高度。

我知道也许使用一个代表首先计算 containerView 的高度并使用这个高度来设置 heightForRow 可能可行我想知道是否有更简单的方法

太感谢了。

4

2 回答 2

2

我只想为面临同样问题的人回答我自己的问题。它不必与静态单元格一起使用,此答案适用于静态单元格和动态单元格。

你要做的就是在containerViewController中设置一个属性或者计算高度的方法(别忘了问layoutIfNeeded)

func tableViewHeight() -> CGFloat {
    tableView.layoutIfNeeded()
    return tableView.contentSize.height
}

然后在主视图控制器(其中嵌入了 containerViewController 的单元格)中,您必须保存对 containerViewController 的引用,例如在 prepare for segue 方法中,如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "containerSegue" {
        guard let containerVC = segue.destination as? SessionCoordinatorController else { return }
        sessionController = containerVC
    }
}

然后只需在 UITableView heightForRowAt 的委托方法中询问容器高度,如下所示(在 masterViewController 中):

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    guard let height = sessionController?.tableViewHeight() else { return UITableViewAutomaticDimension }
    return height
}

就是这样

不要忘记在 containerViewController 中将 tableView.isScrollEnabled 添加为 false

于 2017-10-04T14:10:27.957 回答
0

因此,如果我正确理解您实际上有这些限制:

  • ContentView.bottom = ContainerView.bottom
  • ContentView.trailing = ContainerView.trailing + 标准
  • ContainerView.leading = ContentView.leading + 标准
  • ContainerView.top = ContentView.top

基本上你想要的是这个约束:

  • ContentView.height = ContainerView.height 对吗?但如果你说你有一个非常小的细胞?

如果是这种情况,您可以尝试设置约束来固定 containerView 的最小高度,如下所示:

  • ContainerView.height >= 400 // 例如高度至少为 400

然后你可以尝试为相等的高度设置一个可选的约束:

  • ContentView.height = ContainerView.height(优先级 249 或低)

通过降低约束的优先级,您说“我有这个额外的约束,如果 contentView 与 containerView 高度匹配,如果不继续或接近它,那就太好了”。

这是有关 AutoLayout AutooLayout 理解的更多信息

PS:您不需要通过返回自动维度来实现 tableView:heightForRowAtIndexPath: 委托方法。

于 2017-10-02T13:23:51.643 回答