ios - 根据每个单元格的内容动态调整具有多个 UITableViewCells 时的高度

标签 ios swift uitableview

我是 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
}

最佳答案

1.设置label的约束

2.将 numberOflines 设置为 0(通过 Storyboard或编程方式)

  1. 将这段代码添加到viewDidLoad:

    tableView.estimatedRowHeight = 300
    tableView.rowHeight = UITableViewAutomaticDimension
    

关于ios - 根据每个单元格的内容动态调整具有多个 UITableViewCells 时的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43631419/

相关文章:

Xcode 6.3 不支持 iOS 9

ios - 没有为参数 'appIdName' 提供值

iOS 8 - UIWindow 方向始终为纵向

ios - TableView 在 Swift 中丢失选定的行

ios - 通过主视图 Controller 与 UICollectionViewCell 中的按钮交互

ios - 使用 Codable 使用相同的 key 解码不同的类

javascript - 如何使用 Emscripten 将 Hello Word 从 Swift 编译为 JavaScript

uitableview - 理解 SDWebImage 在 UITableView 中使用的机制

iphone - 多次调用 UITableView numberOfRowsInSection

ios - 通过 AirDrop 发送即时创建的 QR 码 UIImage 失败