当前位置: 首页 > 知识库问答 >
问题:

根据每个单元格的内容动态设置具有多个 UITableView单元时的高度

何晗昱
2023-03-14

我是swift新手,正在从事Swift 3.0中的一个项目,其中我有一个包含三个自定义单元格的UITableView。在第一个中,我只有一个图像、按钮和标签。在第二个,我有一个图像加上标签以及可扩展和可折叠的标题。因此,第二个单元格有三个不同的部分。最后,第三个也只包含一个标签。在第一个单元格中,UILabel被设置在包含一个人的描述的图像下面(已经设置了约束)。我的要求是只对第一个单元格根据描述的大小动态调整单元格大小。非常感谢帮助,代码如下。

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    print("Number of Sections: \(section)")
    return arrayForTableView[section]
}

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let headerView : UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.contentView.backgroundColor = UIColor.yellow.withAlphaComponent(1.0)
}

func tapped(sender: UITapGestureRecognizer)
{
    if let tag = sender.view?.tag{
        expanedSections[tag] = !expanedSections[tag]
    }
    tableView.reloadData()
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = UITableViewHeaderFooterView()
    headerView.tag = section

    let tapRecog = UITapGestureRecognizer(target: self, action: #selector(tapped))

    tapRecog.numberOfTapsRequired = 1
    tapRecog.numberOfTouchesRequired = 1
    tapRecog.delegate = self
    headerView.addGestureRecognizer(tapRecog)
    return headerView
}

func numberOfSections(in tableView: UITableView) -> Int {
    return arrayForTableView.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return 1
    case 1:
        return expanedSections[section] ? getItemsForSection(self.tableData.freeGifts): 0
    case 2:
        return expanedSections[section] ? getItemsForSection(self.tableData.exclusiveOffers) : 0
    case 3:
        return expanedSections[section] ? getItemsForSection(self.tableData.allAudios) : 0
    case 4:
        return expanedSections[section] ? getItemsForSection(self.tableData.testamonials) : 0
    default:
        return  0
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // var cell: UITableViewCell?

    print("Section : \(indexPath.section) : \(indexPath.row)")

    switch indexPath.section {
    case 0:
      let cell =  tableView.dequeueReusableCell(withIdentifier: "HealerDetailsCell", for: indexPath) as! HealerDetailsTableViewCell

      //cell.aboutLabel.preferredMaxLayoutWidth = (tableView.bounds)
          cell.aboutLabel.sizeToFit()
        populateHealerDetails.populateTable(cell, self.tableData.healerDetails)
        return cell
    case 1:

        if tableData.freeGifts.count > 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "OffersCell",for: indexPath)
        PopulateHealerDetailsAndOffers.populateTable(cell, self.tableData.freeGifts[indexPath.row] as! NSDictionary)
            return cell
        } else {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
        cell.textLabel?.text = "No Free Gifts At This Time"
            return cell
        }
    case 2:

        if tableData.exclusiveOffers.count > 0 {
         let cell = tableView.dequeueReusableCell(withIdentifier: "OffersCell",for: indexPath)
        PopulateHealerDetailsAndOffers.populateTable(cell, self.tableData.exclusiveOffers[indexPath.row] as! NSDictionary)
            return cell
        }else {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
         cell.textLabel?.text = "No Exclusive Offers At This Time"
            return cell
        }
    case 3:

        if tableData.allAudios.count > 0{
        let cell = tableView.dequeueReusableCell(withIdentifier: "OffersCell",for: indexPath)
        PopulateHealerDetailsAndOffers.populateTable(cell, self.tableData.allAudios[indexPath.row] as! NSDictionary)
            return cell
        }else{
            let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
            cell.textLabel?.text = "NO Audios To Display"
            return cell
        }
    case 4:

       if tableData.testamonials.count > 0 {
          let  cell = tableView.dequeueReusableCell(withIdentifier: "TestamonialsCell", for: indexPath)
          return cell
       }else{
        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
        cell.textLabel?.text = "No Testamonials"
        return cell
        }
    default:
         let  cell = tableView.dequeueReusableCell(withIdentifier: "TestamonialsCell", for: indexPath)
          return cell
    }

}


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //let indexPath = tableView.indexPathForSelectedRow!
    //let currentCellValue = tableView.cellForRow(at: indexPath)! as UITableViewCell
}

共有3个答案

秦承安
2023-03-14

对于版本

override func viewDidLoad()
{
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" cell height is
}

对情节提要设置约束的步骤:此处

重要的

    < li >如果多行标签,不要忘记将行数设置为0。 < li >不要忘记label . preferredmaxlayoutwidth = CGRectGetWidth(table view . bounds)
扈俊健
2023-03-14

使用此委托方法

   func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
屠君墨
2023-03-14

1.设置标签的约束。

2.放置数字数字等于0(通过故事板或编程方式)

viewDidLoad:中添加此代码

tableView.estimatedRowHeight = 300
tableView.rowHeight = UITableViewAutomaticDimension
 类似资料:
  • 我有用自定义单元格(继承自)填充的用户界面视图,每个单元格都包含一个,该视图根据其内容自动调整大小。事情是这样的,如何根据内容(可变视图)更改 单元格的高度。 该解决方案必须是动态的,因为用于填充< code>UIWebViews的HTML是从不断变化的提要中解析的。 我觉得我需要使用委托方法 中更改单元格的高度吗? 任何帮助都是伟大的。谢谢 两年多前我问过这个问题。通过介绍自动布局,可以找到iO

  • 问题内容: 我在自定义单元格中遇到有关UITextView的问题。除了我的问题,textView的工作原理也很完美。我已经设置了UITextViewDelegate方法,所以当textview发生问题时,我已经连接了那些方法。 我想知道如何让我的自定义单元随着用户的输入而动态增加其高度。一旦用户点击了textview的行尾,也要让textview自动添加另一行。我已经在网上搜索了一段时间,该问题的

  • 可变长度的文本数据正在注入到表视图单元格标签中。为了正确调整每个单元格高度的大小,我在中实现了: 这估计高度为88.0像素,如果更大,应该会自动调整高度大小。它非常适用于尚未滚动到的单元格(因为在滚动到单元格时被调用),但不适用于最初在加载数据时在屏幕上呈现的单元格。 我尝试过重新加载数据(正如许多其他资源中建议的那样): 在这两个和,它没有帮助。我迷路了…有人知道如何渲染最初在屏幕上加载的单元格

  • 我觉得这可能是一个常见的问题,我想知道是否有任何共同的解决方案。 基本上,我的UITableView拥有每个单元格的动态单元格高度。如果我不在UITableView的顶部,并且我< code > table view . reloaddata(),向上滚动会变得不稳定。 我认为这是因为我在向上滚动时重新加载了数据,UITableView正在重新计算每个可见单元格的高度。如何减轻这种情况,或者如何只

  • 问题内容: 我有一张桌子,应该始终占据屏幕高度的一定百分比。大多数行的高度都是固定的,但我有一排应该伸展以填充可用空间。万一该行中单元格的内容超出了所需的高度,我希望使用overflow:hidden剪切内容。 不幸的是,表和行不遵守max-height属性。(这在W3C规范中)。当单元格中的文本过多时,表格将变高,而不是坚持指定的百分比。 如果我为其指定一个固定的高度(以像素为单位),则可以使表

  • 问题内容: 我觉得这可能是一个常见的问题,并且想知道是否有任何通用的解决方案。 基本上,我的UITableView具有每个单元格的动态单元格高度。如果我不在UITableView和I的顶部,则向上滚动变得跳动。 我相信这是由于以下事实:当我向上滚动时重新加载数据时,UITableView正在重新计算每个可见的单元格的高度。如何缓解这种情况,或者如何仅将数据从某个IndexPath重新加载到UITa