根据TableView的大小调整ScrollView的大小

时间:2019-06-19 13:28:11

标签: ios swift tableview scrollview

我正在尝试创建如下结构的布局:

 - View 
   -- ScrollView
       --- ContentView
            ---- CustomView
            ---- CustomView
            ---- TableView
            ---- CustomView

tableView本身可以使用“ invalidateIntrinsicContentSize”自动调整大小,当我添加项目时,tableview的高度会发生变化,将其下方的自定义视图进一步向下推。

一旦添加了足够多的项目,我的底部自定义视图就会被隐藏,并且滚动无法正常工作。

重要事实-底部自定义视图没有底部约束。它的最高约束将其向下推到tableView

如果我设置了底部约束,则表视图将不再动态调整大小。

预期的行为: 当用户向列表中添加项目并且列表太大时,ContentView将可以滚动,因此用户可以滚动以查看底部的view

实际行为: 当用户向列表中添加项目时,如果列表太大,则会向下推底视图,并且视线和内容无法滚动。

正在发生什么,我该如何解决?

4 个答案:

答案 0 :(得分:1)

您可以为表视图高度创建一个约束,并通过拖动其他视图时将其引用到您的swift文件。现在在您的代码中,只需执行此操作

tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;

如果在scrollview中完美地设置了其他约束,则它应该可以正常工作。意味着TableView应该具有top的{​​{1}},bottomleftright的边距约束。

答案 1 :(得分:1)

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

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

要实现所需的功能,必须使UITableView不可滚动,并使用intrinsicHeight中的UITableView来获取UITableView的实际高度以及所有项目。如果您拥有高度不同的项目,这将是一个问题,因为在渲染之前您将不知道高度。在所有行的高度相同的情况下,您可以获取UITableView的总高度并将高度约束设置为该值。这将增加外部contentSize的{​​{1}},使其可滚动。

ScrollView外,您还可以使用UITableView。这是因为您始终没有使用UIStackView的重用功能。管理UITableViewdatasource应该不是大问题。

答案 2 :(得分:0)

尝试此代码

        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

答案 3 :(得分:0)

我认为您可以做的是:

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

还将带有垂直轴和.fillEqually分布的UIStackView用作内容视图会更加方便,因为您不需要为视图设置任何位置约束,但是如果固有内容,则可能需要设置高度约束大小无法由引擎决定