设置UITableView的框架以匹配其内容大小

时间:2012-03-31 13:29:01

标签: ios uitableview uiscrollview

我在更大的UIScrollView中有一个非滚动的UITableView。由于表视图是非滚动的,我希望它的帧大小始终与其内容大小匹配。

我有以下方法:

- (void)resizeTableViewFrameHeight
{
    // Table view does not scroll, so its frame height should be equal to its contentSize height
    CGRect frame = self.tableView.frame;
    frame.size = self.tableView.contentSize;
    self.tableView.frame = frame;
}

问题是我必须在错误的时间调用此方法(在设置contentSize之前)。我想知道,有没有我可以在UITableView上设置的属性会导致其框架始终自动匹配其内容大小?

2 个答案:

答案 0 :(得分:0)

没有动态调整表格视图框架的属性。另外,我不认为UITableView可以预先计算其整个contentSize因为表格视图的大小实际上是无限的,这取决于其datasource和其他代表的指定内容诸如heightForRowAtIndexPath之类的方法。这些方法可以是动态的,因此几乎不可能预测表视图的整个大小。

我的结论是你可能没有正确使用这个UI元素。

解决方法:

通过将表视图的框架约束到滚动视图的可见区域,您可以简单地允许它滚动。也许您需要在滚动表视图时阻止滚动视图滚动,反之亦然。您可以在UIScrollView委托方法中轻松完成此操作。

答案 1 :(得分:0)

我需要在iOS 8中做这样的事情:滚动视图包含一个非滚动的固定宽度表视图,其中包含可变数量的内容行,所以我想动态调整表视图的高度。 / p>

对我来说有用的是使用虚拟值在表视图上设置高度约束,然后为表视图和约束创建出口。那就是我所需要的一切:

class ViewController: UIViewController, UITableViewDataSource {

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

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        tableViewHeightConstraint.constant = tableView.contentSize.height
    }

    // (plus additional data source methods, etc.)
}

我可以想象情况(可能有很多行或可变高度的行),这可能不是那么简单,但这对我有用。