Swift-UITableViewController内部的不可滚动的UITableViewController

时间:2019-07-29 22:53:45

标签: ios swift uitableview

我正在使用Swift制作应用程序,但遇到了一个问题: 我有一个系统,人们可以在其中发布“帖子”,并对这些“帖子”发表评论。

为了显示此内容,我有一个UITableViewController子类,该子类具有该帖子作为标题,以及单元格中的注释。

现在我有一个屏幕需要列出这些帖子。理想情况下,我希望每个帖子及其评论都放在一个单元格中。

这将需要在另一个UITableViewController的单元格中嵌入UITableViewController子类(我们将其称为PostTableViewController)。

问题是,我不希望每个ProfileTableViewControllers在其单元格内滚动。我需要关闭tableViewController上的滚动,并使其高度扩展以适合其整个内容。

我已经查看了this post上的答案,但是仍然遇到问题。目前尚不清楚tableView是否正确调整大小,因为ProfileTableViewController在其各自单元格中的高度始终为0。如果手动设置一个恒定的高度约束,我可以看到其中的一部分,但是我希望它自动调整大小为适合tableView。

我当前的约束设置是:

    //dateView is another view in my tableViewCell
    profileViewController.view.topAnchor.constraint(equalTo: dateView.bottomAnchor).isActive = true
    profileViewController.view.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    profileViewController.view.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    profileViewController.view.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true

    profileViewController.view.bottomAnchor.constraint(equalTo: profileViewController.tableView.tableFooterView!.bottomAnchor).isActive = true
    profileViewController.tableView.topAnchor.constraint(equalTo: profileViewController.view.topAnchor).isActive = true

    self.bottomAnchor.constraint(equalTo: homeViewController.view.bottomAnchor).isActive = true

那么我如何才能使tableView自动适合其内容,并设置约束,以便tableViewCell可以自动调整为tableView的大小?

注意(1):我的界面完全是代码;没有与此情况相关的情节提要

注意(2)::ProfileTableViewControllers的内容是动态的,因此,约束在更改时需要更新。

3 个答案:

答案 0 :(得分:0)

要让tableview将其高度调整到其内容高度,您将需要设置一个附加的高度约束,并在每次重新加载数据时对其进行更新。

这样声明约束,以便可以从类中的其他位置访问它。

private lazy var heightConstraint: NSLayoutConstraint = {
    let constraint = tableView.heightAnchor.constraint(equalToConstant: 0)
    constraint.isActive = true
    return constraint
}()

并在重新加载数据时,将约束常量值设置为tableviews的内容高度

tableView.reloadData()
layoutIfNeeded()
heightConstraint.constant = tableView.contentSize.height

调用layoutIfNeeded将有助于tableview确定其内容大小

别忘了在表格视图中关闭滚动显示

tableView.isScrollEnabled = false

答案 1 :(得分:0)

就我而言,我通常创建一个自定义视图,该视图内部具有UITableView,然后重写intrinsicContentSize属性来确定视图的大小。看下面的代码。

override var intrinsicContentSize: CGSize {
    self.tableView.layoutIfNeeded()
    let size = self.tableView.contentSize
    print("size = \(size)")
    return size
}

在使用AutoLayout System时,这种方式在代码中可能会很好地工作。

如果使用UICollectionView,则可以使用collectionViewContentSize属性代替contentSize

答案 2 :(得分:0)

对于那些将来会关注此问题的人,我最终要做的是将帖子分成tableView部分而不是单元格,然后为profileTableViewController添加一个单元格,并在其下方添加注释。

>