具有动态 tableView 高度的模糊布局
Ambiguous layout with dynamic tableView height
我有一个 viewController,我想在里面放两个 1 个 tableView 和 1 个 childViewController。
- tableView 不可滚动,具有动态单元格高度。 (我使用的是 tableView,所以我可以折叠行)
- childVC 是一个具有动态单元格高度的可滚动 tableView。
我的限制是:
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.bottomAnchor.constraint(equalTo: artistVC.view.topAnchor),
])
NSLayoutConstraint.activate([
artistVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
artistVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
artistVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
当我这样设置时,屏幕上只显示 childVC。我没有看到 tableView。 我想让 tableView 可以根据需要展开,然后让 childVC 滚动到底部。
- 对于 tableView 我得到:
Height and scrollable content size are ambiguous
- 对于 childVC 的视图,我得到:
Height and vertical positions are ambiguous
但是我无法自己设置高度,因为我不知道 tableViewCell 的高度是多少..
有什么建议吗?我试过更改内容拥抱和内容压缩阻力,但我在那里没有找到任何运气。
Table 视图和其他可滚动视图没有 intrinsicContentSize
。例如,如果参与视图是 UIImageView
和 UILabel
两者都可以根据其内容调整大小,那么您的约束会很好,但是因为您的视图是 UITableView
和UIView
(虽然您对 UIView
有足够的限制,不会产生歧义,但它们都不能自动调整自己的大小)您需要自己调整大小。
要获得您想要的行为,您需要 subclass UITableView
并覆盖 intrinsicContentSize
,或者您需要设置高度限制。无论哪种方式,您都需要自己计算正确的高度。内容拥抱和抗压缩性允许自动布局在竞争之间进行裁定 intrinsicContentSizes
,因此他们在这种情况下没有帮助。
例如:
final class SizingTableView: UITableView {
override var intrinsicContentSize: CGSize {
return CGSize(width: bounds.width, height: <# Some appropriate height #>)
}
}
然后在故事板或 xib 中将 table 视图的 class 更改为 SizingTableView
并且您可以为 [=] 的固有内容大小设置设计时占位符31=] 查看尺寸检查以解决任何警告我们的错误。
我建议像这样子classing UITableView
:
class AutomaticHeightTableView: UITableView {
override var intrinsicContentSize: CGSize {
return contentSize
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
}
}
然后在 Interface Builder 中将 AutomaticHeightTableView
设置为 table 视图的 class,table 将尝试调整自身大小以适应内容。它将遵循您设置的任何其他约束,因此请确保约束允许它自由增长。
我有一个 viewController,我想在里面放两个 1 个 tableView 和 1 个 childViewController。
- tableView 不可滚动,具有动态单元格高度。 (我使用的是 tableView,所以我可以折叠行)
- childVC 是一个具有动态单元格高度的可滚动 tableView。
我的限制是:
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.bottomAnchor.constraint(equalTo: artistVC.view.topAnchor),
])
NSLayoutConstraint.activate([
artistVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
artistVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
artistVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
当我这样设置时,屏幕上只显示 childVC。我没有看到 tableView。 我想让 tableView 可以根据需要展开,然后让 childVC 滚动到底部。
- 对于 tableView 我得到:
Height and scrollable content size are ambiguous
- 对于 childVC 的视图,我得到:
Height and vertical positions are ambiguous
但是我无法自己设置高度,因为我不知道 tableViewCell 的高度是多少..
有什么建议吗?我试过更改内容拥抱和内容压缩阻力,但我在那里没有找到任何运气。
Table 视图和其他可滚动视图没有 intrinsicContentSize
。例如,如果参与视图是 UIImageView
和 UILabel
两者都可以根据其内容调整大小,那么您的约束会很好,但是因为您的视图是 UITableView
和UIView
(虽然您对 UIView
有足够的限制,不会产生歧义,但它们都不能自动调整自己的大小)您需要自己调整大小。
要获得您想要的行为,您需要 subclass UITableView
并覆盖 intrinsicContentSize
,或者您需要设置高度限制。无论哪种方式,您都需要自己计算正确的高度。内容拥抱和抗压缩性允许自动布局在竞争之间进行裁定 intrinsicContentSizes
,因此他们在这种情况下没有帮助。
例如:
final class SizingTableView: UITableView {
override var intrinsicContentSize: CGSize {
return CGSize(width: bounds.width, height: <# Some appropriate height #>)
}
}
然后在故事板或 xib 中将 table 视图的 class 更改为 SizingTableView
并且您可以为 [=] 的固有内容大小设置设计时占位符31=] 查看尺寸检查以解决任何警告我们的错误。
我建议像这样子classing UITableView
:
class AutomaticHeightTableView: UITableView {
override var intrinsicContentSize: CGSize {
return contentSize
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
}
}
然后在 Interface Builder 中将 AutomaticHeightTableView
设置为 table 视图的 class,table 将尝试调整自身大小以适应内容。它将遵循您设置的任何其他约束,因此请确保约束允许它自由增长。