【问题标题】:Dynamic UITableCellView height动态 UITableCellView 高度
【发布时间】:2014-11-05 08:31:07
【问题描述】:

我按照本教程启用动态单元格高度:http://www.appcoda.com/self-sizing-cells/

所以我加了

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

viewDidLoad 中,将标签设置为 0 Lines,将字体设置为 System。结果是单元格的大小现在是动态的,并且内容正确显示,但不是在第一次显示表格时。好吧,有些单元格显示正确,但其他单元格的高度为 44。当我滚动表格时,高度似乎已得到纠正。在教程中,他们这样描述:

第一次显示表格视图时,您可能会发现一些单元格 尺寸不合适。但是当你滚动表格视图时,新的 单元格以正确的行高显示。要解决此问题, 您可以在视图出现后强制重新加载

我试过了

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.estimatedRowHeight = 64
    self.tableView.rowHeight = UITableViewAutomaticDimension
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.tableView.reloadData()
}

但它不起作用。任何想法如何解决这一问题?我在 xcode 6.1 和 iOS8.1 上,我正在使用 swift。

我在github上创建了一个简单的测试项目:https://github.com/ArtworkAD/DynamicCellTest

【问题讨论】:

  • 显示你的 viewDidLoad() 函数
  • @OlegGordiichuk 我编辑了我的问题。

标签: ios uitableview swift


【解决方案1】:

我下载了您在 GitHub 上创建的项目并进行了一些更改并使其正常运行。

ViewController 中的代码如下所示...

import UIKit

class MyTableViewController: UITableViewController {

    var entries:Array<String> = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        var i = 0
        while i < 20 {
            entries.append("\(i) Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor")
            i++;
        }

        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.entries.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //ask for a reusable cell from the tableview, the tableview will create a new one if it doesn't have any
        let cell = self.tableView.dequeueReusableCellWithIdentifier("basic_cell", forIndexPath: indexPath) as UITableViewCell

        var label = cell.viewWithTag(13)

        if let unwrappedLabel = label as? UILabel {
            unwrappedLabel.text = self.entries[indexPath.row]
        }

        return cell
    }
}

故事板看起来像这样......

注意 AutoLayout 约束从单元格的顶部到底部,我将行数设置为 0。

那么在运行应用的时候...

【讨论】:

  • 嗯,这对我不起作用,我在 github 上创建了一个简单的测试项目。请查看github.com/ArtworkAD/DynamicCellTest
  • @artworkadshi 啊,我明白了。阅读我链接的博客。它使用静态 tableView 但理论仍然相同。据我发现,您需要使用带有 AutoLayout 约束的自定义单元格来布置内容。尝试使用 AutoLayout 自定义单元格类型和 UILabel。
  • 我还有一个问题和这个问题很相关stackoverflow.com/questions/26757305/…
【解决方案2】:

我认为可以在dispatch_once 块内重新加载willDisplayCellMethod 中的表。它是一种客观的 C 语法。您可以快速锻炼。

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        [self.tableView reloadData];
    });
}

【讨论】:

  • 我认为这是错误的。这会导致表格只显示一个单元格。
  • 我刚刚检查过了。这对我来说可以。我认为你应该考虑你的反对票。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 2018-05-09
  • 2016-07-27
  • 2012-09-08
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多