【问题标题】:Cannot Set Dynamic TableView Row Height无法设置动态 TableView 行高
【发布时间】:2021-12-23 06:11:03
【问题描述】:

我正在尝试在 TableView 中设置动态行高。但不幸的是无法正常工作。

唯一可行的方法是将heightForRowAt indexPath 设置为一个常数。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 470 //or any other number
}

如果我删除此功能,或尝试将其设置为自动,则单元格将不会显示。像这样的:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}

我也试过用:

self.tableView.estimatedRowHeight = UITableView.automaticDimension //Tried even with a number
self.tableView.rowHeight = UITableView.automaticDimension

但除了在heightForRowAt indexPath 函数中使用恒定高度之外似乎没什么用。这不是我想要的,我希望根据单元格内的内容扩展单元格。

我还尝试将 heightForRowAt indexPath 函数中的高度设置为自动,但在单元格 xib 文件的内容中为约束设置了固定高度,仍然相同(我这样做只是为了看看会发生什么)。看来,这个函数有问题。

注意: 我的 TableView 和 UITableViewCell 分为一个storyboard 和一个xib 文件。

【问题讨论】:

标签: ios swift uitableview


【解决方案1】:

如果要设置动态tableview行高,必须使用autolayout。

请在单元格中设置 UI 组件的约束,如下图所示。

我使用 UILabel 作为示例代码。对于 UILabel,请务必将 Lines 设置为 0。

这里是示例代码

class ViewController: UIViewController {
    
    let stringArr = ["aaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"]
    
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.dataSource = self
        
        tableView.estimatedRowHeight = 100
        tableView.rowHeight = UITableView.automaticDimension
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return stringArr.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "TestCell", for: indexPath) as? TestCell else {
            return UITableViewCell()
        }
        
        cell.label.text = stringArr[indexPath.row]
        
        return cell
    }
}
  • 您需要在表格视图中注册单元格。

tableView.register(UINib(nibName: “YourCellNibName”, bundle: nil), forCellReuseIdentifier: “YourCellReuseIdentifier”)

【讨论】:

  • 我这样做了,但单元格根本没有显示。
  • 我更新了我的问题,添加了一条注释。注意:我的 TableView 和 UITableViewCell 分为一个故事板和一个 xib 文件。
  • 你在tableview中注册了cell吗?如果还没有注册,请按如下方式注册: //In viewDidLoad// tableView.register(UINib(nibName: “YourCellNibName”, bundle: nil), forCellReuseIdentifier: “YourCellReuseIdentifier”)
  • 是的,我做到了,当我在 heightForRowAt indexPath 函数中设置固定高度时,单元格正在显示。无论如何,当设置为自动或删除该功能时,我都会这样做,在这些情况下,单元格不会显示。我还尝试将其设置为自动,但在单元格 xib 文件的内容中设置约束的固定高度。还是一样。
  • 好的,找到了解决方案。在cellForRowAt indexPath 函数中,前一个开发人员返回的不是cell,而是UITableViewCell。我没有注意到,看到后我修复了。我会将此答案标记为正确,因为您已经在答案中写下了它。
猜你喜欢
  • 1970-01-01
  • 2016-10-19
  • 2015-08-01
  • 2021-09-18
  • 2023-03-23
  • 2016-08-05
  • 1970-01-01
  • 2017-10-18
  • 2013-09-11
相关资源
最近更新 更多