动态 UITableView 高度与 UIScrollView 中的动态 UITableViewCells

Posted

技术标签:

【中文标题】动态 UITableView 高度与 UIScrollView 中的动态 UITableViewCells【英文标题】:Dynamic UITableView height with dynamic UITableViewCells in UIScrollView 【发布时间】:2018-04-06 14:33:28 【问题描述】:

我对如何实现(或者甚至可能)使用动态 UITableViewCells 实现动态 UITableView 高度有疑问。所以,我有一些像新闻细节这样的东西,上面有一些视图(图片、标签等),下面是我想要制作 cmets 部分的所有内容。评论滚动是错误的,我需要调整整个 tableview 和整个屏幕的大小以匹配所有内容大小。我知道 tableView 是 scrollView,我可以制作整个新闻详细信息视图,如 tableview,其中标题将是所有视图(如图像、标签等)。

但是我可以让它像这样工作吗?我制作了具有 [图像(具有固定高度)、标签等和 cmets tableView(需要具有内容大小高度,不可滚动)] 的 View(内容视图)] 我尝试使用

tableView.isScrollEnabled = false
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 220 

override func viewWillLayoutSubviews() 
super.updateViewConstraints()
self.tableViewHeight?.constant = self.tableView.contentSize.height
 

但没有运气。唯一发生的事情是我得到了由公式 rows.count *estimatedRowHeight 计算的内容大小,所以有时我会削减一些内容,有时我会在表格下方得到如此多的空白空间。谢谢!

编辑:这是解决方案

class ViewController: UIViewController 

  @IBOutlet weak var tableView: UITableView!
  @IBOutlet weak var tableViewHeight: NSLayoutConstraint!

  private var contentSizeObservation: NSKeyValueObservation?

  override func viewDidLoad() 
    super.viewDidLoad()
    tableView.isScrollEnabled = false
    tableView.dataSource = self
    contentSizeObservation = tableView.observe(\UITableView.contentSize, options: [.new])  (_, change) in
      if let newSize = change.newValue 
        self.tableViewHeight.constant = newSize.height
      
    
  


【问题讨论】:

【参考方案1】:

我认为你只需要一个 UITableView。只需将您的 cmets 添加为单元格并将您的新闻详细信息设置为 tableHeaderView:https://developer.apple.com/documentation/uikit/uitableview/1614904-tableheaderview。

如果你想在 TableView 标题中使用 AutoLayout,你必须做一些变通方法,但仍然相当简单,你会在 *** 上找到很多关于它的主题。就我而言,我为 UITableView 创建了简单的扩展:

internal extension UITableView 

    /// Workaround for not working AutoLayout with UITableView.tableHeaderView
    /// This function needs to be called after calculating TableView position
    /// In case of UIViewController: viewDidLayoutSubviews()
    /// In case of UIView: layoutSubviews()
    func relayoutTableHeaderView() 
        guard let tableHeaderView = tableHeaderView else  return 
        tableHeaderView.layoutIfNeeded()
        tableHeaderView.frame.size = tableHeaderView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
        self.tableHeaderView = tableHeaderView
    

标题和单元格都可以使用 AutoLayout 动态计算

【讨论】:

以上是关于动态 UITableView 高度与 UIScrollView 中的动态 UITableViewCells的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 动态高度不改变 iOS

UITableView 动态单元格高度在过渡或旋转时中断

使用自动布局的 UITableView 中的动态 UITextView 高度?

动态调整 UITableView 高度

获取 UITableView 动态高度的最佳方法是啥?

动态 UITableView 单元格高度的问题