我正在将一个 UITableView
嵌入到另一个 UIScrollView
中。我只想让 UIScrollView
滚动,而不是 UITableView
,因此我想禁用 UITableView
的滚动,并扩展 UITableView
的 contentHeight
以一次性容纳所有动态内容。
我该如何实现这一点?
我正在将一个 UITableView
嵌入到另一个 UIScrollView
中。我只想让 UIScrollView
滚动,而不是 UITableView
,因此我想禁用 UITableView
的滚动,并扩展 UITableView
的 contentHeight
以一次性容纳所有动态内容。
我该如何实现这一点?
class MyOwnTableView: UITableView {
override var intrinsicContentSize: CGSize {
self.layoutIfNeeded()
return self.contentSize
}
override var contentSize: CGSize {
didSet{
self.invalidateIntrinsicContentSize()
}
}
override func reloadData() {
super.reloadData()
self.invalidateIntrinsicContentSize()
}
}
在Interface Builder中,将tableView的类更改为MyOwnTableView(继承UITableView的子类)。
为tableView设置自动行高。
tableView.estimatedRowHeight = 60.0;
tableView.rowHeight = UITableViewAutomaticDimension;
第二种方法: 1. 为tableView创建一个具有任何值的高度约束,并连接一个IBOutlet,该IBOutlet会设置tableView的高度。
在重新加载数据后,将高度约束的常量设置为tableView.contentSize.height。
self.tableViewHeight.constant = self.tableView.contentSize.height
UITableView
的滚动设置为 false
。tableview.scrollEnabled = false;
tableview.frame = CGRectMake(tableview.frame.origin.x, tableview.frame.origin.y, tableview.frame.size.width, tableview.frame.size.height+(resultArray.count*HEIGHT_OF_CELL));
然后,您可以通过将UITableView
的内容大小设置为UITableView
的高度,在UIScrollView
上添加UITableView
。
设置tableView的尺寸与contentSize相等。
override func viewDidLayoutSubviews() {
tableView.frame.size = tableView.contentSize
}
基本上,tableview的内容大小就是你所需要的。
将tableview的滚动设置为false
,因为我们不希望有滚动行为。
获取tableview高度约束的引用。
设置tableViewHeightConstraint.constant = tableView.contentSize.height
确保tableview的顶部、底部、前导和尾随约束已经就位。
UITableView
Scrolling to NO
Second, create a height constraint
for the table view and after you call [UITableView reloadData]
change your height constraint
tableViewHeightConstraint.constant = numberOfRows * heightOfEachRow;
你也可以使用Combine通过KVO来观察tableView的contentSize
。
想法: 每当tableView的contentSize
发生变化时,更新它的高度约束。
我尝试使用此线程中的某些解决方案来实现它,但由于时间问题,有时会得到错误的contentSize
值。使用KVO确保捕获所有contentSize
的更新。
viewDidLoad
中tableView的contentSize
更改KVO部分的代码示例:
class YourViewController: UIViewController {
private var tokens: Set<AnyCancellable> = []
func viewDidLoad() {
super.viewDidLoad()
tableView.publisher(for: \.contentSize).sink { [weak self] contentSize in
self?.tableViewHeightConstraint.constant = contentSize.height
}.store(in: &tokens)
}
}
如果使用固定内容的tableview作为scrollview的子视图,这非常容易实现,但您确切想要实现什么?动态单元格上下固定内容?在中心滑动部分永久显示内容?
也许更清晰的设计是使用单个UITableView和表头、表尾或节头、节尾,利用UITableViewStyleGrouped与UITableViewStylePlain提供的自动行为。
话虽如此,其他答案似乎也是一个不错的解决方案:
Set scroll enabled false on table view
Set tableview content size to sum of all cell sizes
Set tableview frame to content size
Adjust scroll view frame to account for dynamic table size if necessary
Add table view to scroll view amidst other content
另一种操作滚动行为的选项是在委托scrollView shouldStartScrolling或类似方法中检查tableview或scrollview,因为这将允许更多的UI控件灵活性
UITableView是一个滚动视图。虽然你不应该嵌套UIScrollviews,但你可以禁用表格视图的滚动。