Swift:如何在包含多个单元格的TableViewController中设置动态单元格高度

时间:2016-08-22 04:49:10

标签: swift uitableview

我有一个TableViewController,它包含三个不同的自定义单元格。对于第一个单元格,我想要包含一个水平滚动的CollectionView,第二个单元格包含一个CollectionView,第三个单元格包含一个垂直的CollectionView。我写这样的代码:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 3
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {


    if indexPath.section == 0 {

        let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell1") as! HomePageTableViewCell1


        return cell
    }

     else if indexPath.section == 1 {

        let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell2") as! HomePageTableViewCell2


        return cell
    }
     else {

        let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell3") as! HomePageTableViewCell3


        return cell
    }

}

它的工作方式与我想的一样,但我不确定这是实现我想要的最佳方式吗?因为我是Swift的新手,也许有更好的方法可以做到这一点?

其次,对于这三个单元格,我想基于内容保留动态高度。例如,第一个单元格包含一个高度为260的ImageView,第二个单元格包含一个高度为140的ImageView。第三个单元格包含一个CollectionView,它将返回4行,每行中有一个高度为96的ImageView。我所做的是:

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if indexPath.section == 0 {
         return 260
    }
    else if indexPath.section == 1 {
        return 140
    }
    else {
        return 500

    }
}

但这意味着我必须在我知道内容高度的情况下对这些高度进行硬编码。但是,如果我不知道高度,如果第三个单元格将返回5行,这意味着500还不够,那么我应该怎么做才能让单元格达到动态高度。

2 个答案:

答案 0 :(得分:1)

这是可能的:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    if indexPath.section == 0 {

        let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell1") as! HomePageTableViewCell1

        let string1 = "blablabla"
        let charCountString1 = string1.character.characters.count

        tableView.rowHeight = CGFloat(charCountString1)
        return cell
    }

     else if indexPath.section == 1 {

        let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell2") as! HomePageTableViewCell2

        let imageHeight = imageView.frame.height

        tableView.rowHeight = CGFloat(imageHeight)
        return cell
    }
     else {

        let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell3") as! HomePageTableViewCell3

        let string3 = "ldsakjfalksdjflk"
        let charCountString3 = string3.character.characters.count

        tableView.rowHeight = CGFloat(charCountString3)
        return cell
    }

}

答案 1 :(得分:0)

您可以始终在内容的基础上获得tableView的动态高度,无需返回静态高度,只需在单元格中正确设置约束,并始终使用首选优先级进行内容拥抱内容 - compressionResistance。 / p>

在-viewDidLoad中 刚设置

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 60; // or whatever is suitable for you 

你也可以参考Ray Wenderlich的教程 Self-sizing Table View Cells