动态UITableCellView高度

时间:2014-11-05 08:31:07

标签: ios uitableview swift

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

所以我添加了

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

viewDidLoad中,将标签设置为0行,将字体设置为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

2 个答案:

答案 0 :(得分:2)

我下载了你在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
    }
}

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

enter image description here

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

然后在运行应用程序时......

enter image description here

答案 1 :(得分:-2)

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

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

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        [self.tableView reloadData];
    });
}