根据 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 应该有 topbottomleftright 来自 ScrollView.

的边缘约束

以下是我认为正在发生的事情。

由于您使用的是 UITableView,它有自己的滚动视图。因此,当 UITableView 列表变得太大时,UITableView 本身变得可滚动,而不是 ScrollView 的 contentView 变得可滚动。

要实现您的需要,您必须使 UITableView 不可滚动并使用 UITableViewintrinsicHeight 来获取 UITableView 的实际高度连同所有物品。如果您有高度不同的项目,这将是一个问题,因为您在渲染之前不知道高度。对于所有行的高度相同,您可以获得 UITableView 的总高度并将高度约束设置为该值。这将增加外部 ScrollViewcontentSize,使其可滚动。

除了UITableView,您还可以使用UIStackView。这是因为无论如何您都没有使用 UITableView 的重用功能。管理 datasourcedelegates 应该不是什么大问题。

试试这个代码

        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

我认为你可以做的是:

  1. 禁用 tableView 的滚动 tableView.isScrollEnabled = false
  2. 每次用户将项目添加到列表时,重新加载 tableView

同时使用带有垂直轴和 .fillEqually 分布的 UIStackView 作为内容视图会更方便,因为您不需要为视图设置任何位置限制,但如果需要,可能需要设置高度限制引擎无法确定内在内容大小