根据 TableView 大小调整 ScrollView 大小
Resize ScrollView based on TableView size
我正在尝试创建结构如下的布局:
- View
-- ScrollView
--- ContentView
---- CustomView
---- CustomView
---- TableView
---- CustomView
tableView
本身可以使用 "invalidateIntrinsicContentSize" 自动调整大小,当我添加项目时 - tableview
的高度发生变化,将其下方的自定义视图进一步向下推。
一旦添加了足够多的项目,我就会隐藏底部的自定义视图,并且滚动不起作用。
重要事实 - 底部自定义视图没有底部约束。它被它的顶部约束下推到 tableView
.
如果我确实设置了底部约束 - table 视图将不再动态调整大小。
预期行为:
当用户向列表添加项目并且列表变得太大时,ContentView 将是可滚动的,因此用户可以滚动查看底部 view
.
实际行为:
当用户向列表中添加项目并且列表变得太大时,底部视图被向下推到视线之外并且内容不可滚动。
这是怎么回事,我该如何解决?
您可以为 tableview 高度创建一个约束,并在您获取其他视图时通过拖动它来引用您的 swift 文件。现在在您的代码中,只需执行此操作
tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;
如果您在 scrollview 中完美地设置了其他约束,它应该可以完美地工作。意味着 TableView
应该有 top
、bottom
、left
、right
来自 ScrollView
.
的边缘约束
以下是我认为正在发生的事情。
由于您使用的是 UITableView
,它有自己的滚动视图。因此,当 UITableView
列表变得太大时,UITableView 本身变得可滚动,而不是 ScrollView 的 contentView 变得可滚动。
要实现您的需要,您必须使 UITableView
不可滚动并使用 UITableView
的 intrinsicHeight
来获取 UITableView
的实际高度连同所有物品。如果您有高度不同的项目,这将是一个问题,因为您在渲染之前不知道高度。对于所有行的高度相同,您可以获得 UITableView
的总高度并将高度约束设置为该值。这将增加外部 ScrollView
的 contentSize
,使其可滚动。
除了UITableView
,您还可以使用UIStackView
。这是因为无论如何您都没有使用 UITableView
的重用功能。管理 datasource
和 delegates
应该不是什么大问题。
试试这个代码
tblViewHeight.constant = CGFloat( tableview row count * 45 )
var size = contentView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
if size.height < scrollView.frame.size.height
{
size = scrollView.frame.size
}
contenViewHeight.constant = size.height - scrollView.frame.size.height
scrollView.contentSize.height = contenViewHeight.constant
我认为你可以做的是:
- 禁用 tableView 的滚动
tableView.isScrollEnabled = false
- 每次用户将项目添加到列表时,重新加载 tableView
同时使用带有垂直轴和 .fillEqually
分布的 UIStackView 作为内容视图会更方便,因为您不需要为视图设置任何位置限制,但如果需要,可能需要设置高度限制引擎无法确定内在内容大小
我正在尝试创建结构如下的布局:
- View
-- ScrollView
--- ContentView
---- CustomView
---- CustomView
---- TableView
---- CustomView
tableView
本身可以使用 "invalidateIntrinsicContentSize" 自动调整大小,当我添加项目时 - tableview
的高度发生变化,将其下方的自定义视图进一步向下推。
一旦添加了足够多的项目,我就会隐藏底部的自定义视图,并且滚动不起作用。
重要事实 - 底部自定义视图没有底部约束。它被它的顶部约束下推到 tableView
.
如果我确实设置了底部约束 - table 视图将不再动态调整大小。
预期行为:
当用户向列表添加项目并且列表变得太大时,ContentView 将是可滚动的,因此用户可以滚动查看底部 view
.
实际行为: 当用户向列表中添加项目并且列表变得太大时,底部视图被向下推到视线之外并且内容不可滚动。
这是怎么回事,我该如何解决?
您可以为 tableview 高度创建一个约束,并在您获取其他视图时通过拖动它来引用您的 swift 文件。现在在您的代码中,只需执行此操作
tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;
如果您在 scrollview 中完美地设置了其他约束,它应该可以完美地工作。意味着 TableView
应该有 top
、bottom
、left
、right
来自 ScrollView
.
以下是我认为正在发生的事情。
由于您使用的是 UITableView
,它有自己的滚动视图。因此,当 UITableView
列表变得太大时,UITableView 本身变得可滚动,而不是 ScrollView 的 contentView 变得可滚动。
要实现您的需要,您必须使 UITableView
不可滚动并使用 UITableView
的 intrinsicHeight
来获取 UITableView
的实际高度连同所有物品。如果您有高度不同的项目,这将是一个问题,因为您在渲染之前不知道高度。对于所有行的高度相同,您可以获得 UITableView
的总高度并将高度约束设置为该值。这将增加外部 ScrollView
的 contentSize
,使其可滚动。
除了UITableView
,您还可以使用UIStackView
。这是因为无论如何您都没有使用 UITableView
的重用功能。管理 datasource
和 delegates
应该不是什么大问题。
试试这个代码
tblViewHeight.constant = CGFloat( tableview row count * 45 )
var size = contentView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
if size.height < scrollView.frame.size.height
{
size = scrollView.frame.size
}
contenViewHeight.constant = size.height - scrollView.frame.size.height
scrollView.contentSize.height = contenViewHeight.constant
我认为你可以做的是:
- 禁用 tableView 的滚动
tableView.isScrollEnabled = false
- 每次用户将项目添加到列表时,重新加载 tableView
同时使用带有垂直轴和 .fillEqually
分布的 UIStackView 作为内容视图会更方便,因为您不需要为视图设置任何位置限制,但如果需要,可能需要设置高度限制引擎无法确定内在内容大小