在滚动视图中使用动态高度的表格视图

22

我正在设计一个页面,其中有一个滚动视图和上面一个表格视图(禁用滚动)。为了实现这一点,我查阅了这个问题的答案 - Make UITableView not scrollable and adjust height to accommodate all cells,但没有成功。

视图层次结构及所提供的约束-

-主视图

-滚动视图
固定到主视图的所有边缘(0,0,0,0),与边距有关的约束

-内容视图

固定到滚动视图(0,0,0,0),宽度等于主视图,高度等于主视图(优先级- 250)

-内容视图中的表格视图

禁用滚动,四周留有50点空白,高度(≥),底部间距50(关系≥)。我使用大于等于号来动态增加高度。

现在当我填充我的表格视图时,我使用以下代码

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableview.dequeueReusableCellWithIdentifier("cellreuse", forIndexPath: indexPath) 
        cell.textLabel?.text = name[indexPath.row]

        tableview.frame.size = tableview.contentSize

        return cell
    }
所以当我运行我的代码时,它增加了表视图框架但没有拉伸内容大小,这使得滚动视图无法滚动到表视图的末尾,也使我的表视图不遵守自动布局约束。

我想你不应该在 cellForRowAtIndexPath 中调用 tableview.frame.size = tableview.contentSize - aaisataev
@aaisataev 是的,没错。看看我的回答。 - user5479794
请参考以下链接:https://dev59.com/x2Mk5IYBdhLWcg3wtQFd https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html。希望能有所帮助... :) - luckyShubhra
3个回答

56

我只需要做这个 -

  • 删除这一行 - tableView.frame.size = tableView.contentSize

  • 为表格视图添加高度约束。

  • 将优先级设置为高

  • 创建高度约束的输出口(Ctrl+拖动)。

  • 在需要重新加载表格数据的任何地方,将高度约束设置为tableview的内容高度。

tableHeightConstraint.constant = tableview.contentSize.height

它在我这里可以工作,但是表视图底部显示了一些额外的空间? - Deven
1
我使用了你的方法,只是改变了计算tableview高度的方式,因为对我来说tableview.contentSize.height并没有按预期工作。这是我的方法:rowHeight * numberOfRows - Isaac Bosca
这个不起作用。@user5479794。@Isaac Bosca如果您设置了行高,它就不是自动布局。 - Setar
这个解决方案可行。但是对于自动布局,它会在底部留下额外的空间。 - Bilal Khan
如果不算太晚,发现了新的解决方案。感谢medium.com https://simaspavlos.medium.com/automatic-height-for-uitableview-into-uiscrollview-swift-8943195af10c - Bilal Khan

5
1. 给表格分配一个高度,将其设为常数0。 2. 只需添加以下几行代码:
tableView.heightConstant.constant = CGFloat.greatestFiniteMagnitude
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.heightConstant.constant = tableView.contentSize.height

通过这个,你可以轻松实现动态表格高度。适用于iOS 13和Swift 5。


0

我曾经遇到过同样的问题,并通过以下方式解决:

  1. 为表格视图创建高度约束的输出,优先级为1000

    @IBOutlet private weak var tableViewHeight: NSLayoutConstraint!

  2. viewDidLayoutSubviews中调用tableView.layoutIfNeeded(),然后将表格视图高度约束设置为内容视图的高度

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tableView.layoutIfNeeded()
        tableViewHeight.constant = tableView.contentSize.height
    }
    

已在iOS 14.1和iOS 16.1上进行测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接