UITableViewAutomaticDimension直到滚动才能工作

时间:2015-01-08 14:45:25

标签: ios uitableview swift uikit

首次加载表格视图时,所有可见单元格都是estimatedRowHeight。当我向下滚动时,单元格会自动调整大小,当我向上滚动时,最初估计的单元格会自动调整大小。

一旦细胞自动调整大小,它们似乎永远不会再回到估计的高度。

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
    self.tableView.estimatedRowHeight = 80.0
    self.tableView.rowHeight = UITableViewAutomaticDimension

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "Cell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as CustomTableViewCell

    // Configure the cell...
    let restaurant = restaurants[indexPath.row]
    cell.namelabel.text = restaurant.name
    cell.locationlabel.text = restaurant.location
    cell.typelabel.text = restaurant.type
    cell.thumbnailImageView.image = UIImage(named: restaurant.image)
    cell.thumbnailImageView.layer.cornerRadius = cell.thumbnailImageView.frame.size.width / 2
    cell.thumbnailImageView.clipsToBounds = true
    cell.accessoryType = restaurant.isVisited ? .Checkmark : .None

    return cell
}

关于如何让细胞最初自动调整的想法?

更新:从Xcode 7 beta 6开始,这不再是一个问题

10 个答案:

答案 0 :(得分:26)

在加载表后,只需调用“reloadSections”:

self.tableView.reloadSections(NSIndexSet(indexesInRange: NSMakeRange(0, self.tableView.numberOfSections())), withRowAnimation: .None)

或者在Swift 3中:

let range = Range(uncheckedBounds: (lower: 0, upper: self.tableView.numberOfSections))
self.tableView.reloadSections(IndexSet(integersIn: range), with: .none)

答案 1 :(得分:8)

我遇到了同样的问题,发现附件 cell.accessoryType会因为None而自动调整大小,所以它似乎是Xcode中的一个错误在这一刻。

但正如@Blankarsch所说,如果您需要配件,调用reloadSections(..)有助于解决此问题。

Accessory to "None" solved my issue

答案 2 :(得分:6)

我认为here的答案副作用较少。在cell.layoutIfNeeded()

中专门添加tableView:cellForRowAtIndexPath:

我也正在做@nosov建议的良好做法,但是如果他们需要同时进行测试,我们就不会进行测试。

答案 3 :(得分:5)

像这样覆盖estimatedHeightForRowAtIndexPath

(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

并检查CustomTableViewCell视图中的autoLayout约束。

答案 4 :(得分:1)

请确保您的标签没有在Interface Builder中设置明确的内容大小。它们必须是自动的,如下面的屏幕截图所示,自动行高可以正常工作,而无需预先重新加载任何部分。

enter image description here

答案 5 :(得分:1)

如果您根据单元格本身(而不是单元格内容视图)设置约束,则表格无法获得正确的大小。因此,要解决此问题,必须将约束设置为内容视图。

但是,当您的单元支持带/不带附件视图的配置时,这就是问题。在这种情况下,根据附件视图调整内容视图的大小,结果可能不是用户期望的结果。因此,在这种情况下,解决方案是设置2个约束,一个到单元格,第二个具有较低优先级到单元格内容视图。

答案 6 :(得分:0)

func tableView(_ tableView: UITableView, 
  cellForRowAt indexPath: IndexPath) -> UITableViewCell


- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath;

在函数中设置具有首选内容的单元格,以便UITableViewAutomaticDimension可以完美地工作。

问题是由于单元格内容已加载到其他某个委托功能中引起的,因此您可以看到单元格会自动调整为所需的大小。

答案 7 :(得分:0)

确保在tableView:cellForRowAt:中初始化您的单元格。当我在tableView:willDisplay:forRowAt:

中设置单元格内容时,即使使用Xcode 8,我也遇到了这个问题

答案 8 :(得分:0)

对我来说,使用willDisplay单元格设置标签文本

时,我只会遇到此问题

如果我在cellForRowAt索引路径中设置我的标签文本,一切都很好

答案 9 :(得分:0)

对我而言,解决它的是@ [David Hernandez]答案的组合。 enter image description here

从上面删除了选择,在Cell的layoutSubviews中,我将preferredMaxLayoutWidth设置为此(将30更改为所需的左右间距)

-(void) layoutSubviews {
    [super layoutSubviews];
    self.textDescriptionLabel.preferredMaxLayoutWidth = self.frame.size.width - 30;
}