如何使UITableView适合内容的大小

时间:2016-01-27 03:47:22

标签: ios swift uitableview

我有一个UITableView(让我们称之为tbl_A)在一个表格视图单元格中,其高度是动态的并由UITableViewAutomaticDimension设置。 tbl_A的单元格高度也是动态的,我知道tbl_A的数据不会太多。所以我希望tbl_A 滚动禁用,其 frame.size等于其内容大小。我试图设置tbl_A&#39的frame.size.height = tbl_A.contentSize.height,遗憾的是,高度错误。

顺便说一下,我不必使用UITableView来完成这项任务。我只是想以一种方式显示所有数据。有什么建议吗?

这是我想要实现的效果: enter image description here

7 个答案:

答案 0 :(得分:9)

简单;)

override var intrinsicContentSize: CGSize {
    return contentSize
}

答案 1 :(得分:4)

基于@Emad的答案,但有重要的补充,如果contentSize更改,则会使固有内容大小无效。

class ContentWrappingTableView: UITableView {

  override var intrinsicContentSize: CGSize {
    return self.contentSize
  }

  override var contentSize: CGSize {
    didSet {
        self.invalidateIntrinsicContentSize()
    }
  }
}

答案 2 :(得分:2)

只要滚动被锁定,您就可以使用以下内容动态匹配tableView的布局:

    let size = actionsViewController.view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
    actionsViewController.view.frame.size = size
    actionsViewController.preferredContentSize = size

以下介绍了一种自动布局为您计算高度的方法,并根据您传入的限制为您提供尺寸。另一种方法可能如下:

    CGFloat leftViewHeight = 0;
    if (self.isExpanded) {
        [self.lineItemLineNumberListTableViewController.tableView layoutIfNeeded];
        UITableView *tableView = self.lineItemLineNumberListTableViewController.tableView;
        CGSize tableViewContentSize = tableView.contentSize;
        leftViewHeight = tableViewContentSize.height;
    }

self.leftViewHeightConstraint.constant = leftViewHeight;

我以前使用上面的内容来动态扩展动态调整单元格,并在其中包含动态子视图。这会在重新加载tableView的内容后根据内容大小配置高度约束,以确保在调整大小之前加载内容。

答案 3 :(得分:0)

  1. 您也可以使用scrollView。
  2. 在该scrollView中添加每个子单元时,通过添加每个子单元的高度来跟踪每个子单元(将变量作为referenceHeight)
  3. 最后通过计算高度(referenceHeight)
  4. 设置scrollview高度

答案 4 :(得分:0)

下面是查找tableView内容大小的方法。

- (CGFloat)tableViewHeightOfTable:(UITableView *)table
{
   [table layoutIfNeeded];
   return [table contentSize].height;
}

确保在重新加载表后调用此方法,如下面的代码。

[YourTable reloadData];
YourTable.frame.size.height = [self tableViewHeightOfTable:YourTable];

答案 5 :(得分:0)

1)在类中添加对约束的引用:

var heightC: NSLayoutConstraint!

2)禁用滚动并添加高度约束:

tableView.scrollEnabled = false
heightC = tableView.autoSetDimension(.Height, toSize: 20) // using PureLayout library

3)覆盖你的控制器的viewDidLayoutSubviews:

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

并设置高度约束"常数"属性为tableview内容高度。

4)关于数据刷新(例如当项目数从0变为更多时)只需将主控制器视图强制布局:

view.setNeedsLayout()

答案 6 :(得分:-2)

在你的情况下tableview是最好的解决方案,你可以使用不同的uitableviewcells和section,并可以在cellForRowAtIndexPath中加载它。