动态UITableView高度与UIScrollView

时间:2018-04-06 14:33:28

标签: ios swift uitableview uiscrollview uikit

我有问题如何实现(或甚至可能)使用动态UITableViewCells实现动态UITableView高度。所以,我有一些新闻细节,有一些观点在顶部(图片,标签等),下面我想做的评论部分。滚动的注释是错误的,我需要调整整个tableview和整个屏幕的大小以匹配所有内容大小。我知道tableView是scrollView,我可以制作整个新闻详情视图,如tableview,其中标题将是所有视图(如图像,标签等)。

但我可以让它像这样工作吗?我做了View - > ScrollView - >查看(内容视图)有[图像(具有固定高度),标签等和评论tableView(需要内容大小高度,不可滚动)]我试过

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 个答案:

答案 0 :(得分:0)

我认为你需要的只是一个UITableView。只需将您的评论添加为单元格,然后将新闻详细信息设置为tableHeaderViewhttps://developer.apple.com/documentation/uikit/uitableview/1614904-tableheaderview

如果你想在TableView标题中使用AutoLayout,你必须做一些变通办法,但仍然相当容易,你会在StackOverflow上找到很多关于它的主题。对于我的情况,我为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

动态计算标题和单元格