我想使用autolayout实现一个欲望行为(或者如果使用委托或其他东西不可能)。我有一个带有一个静态单元格的tableView,这个单元格有一个带有动态原型单元格的tableViewController的containerView。
我想要的是能够使用autolayout动态设置嵌入了容器视图的静态单元格的高度。
这是故事板:
这些是我的约束(带有容器视图的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
}
但是有了这个,静态单元格的高度真的很小......这意味着自动布局不能仅使用我设置的约束来设置其内容的高度。我只说限制因为如果我在containerView的contentView上设置了一个约束,它将高度设置为400,然后该单元格的高度为400 ..
我只是想知道是否有一种方法可以使用autolayout来设置静态单元格的高度以匹配containerView的高度。
我知道可能使用一个委托首先计算containerView的高度并使用此高度来设置heightForRow,这可能是我想知道是否有更简单的方法
非常感谢你。
答案 0 :(得分: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
答案 1 :(得分:0)
因此,如果我正确理解你实际上有这些限制:
基本上你想要的是这个约束:
如果是这种情况,您可以尝试设置约束来修复containerView的最小高度,如下所示:
然后你可以尝试为等高设置一个可选约束:
通过降低约束的优先级,你说“我有这个额外的约束,如果contentView与containerView高度相匹配,如果不继续或接近它就会很好”。
以下是有关AutoLayout AutooLayout Understanding
的更多信息P.S:你不需要通过返回automaticDimension来实现tableView:heightForRowAtIndexPath:delegate方法。