无法在 cellForRowAtIndexPath 中获取单元格框架或约束

Posted

技术标签:

【中文标题】无法在 cellForRowAtIndexPath 中获取单元格框架或约束【英文标题】:Unable to get cell frame or constraints in cellForRowAtIndexPath 【发布时间】:2015-01-03 17:39:57 【问题描述】:

问题

我正在尝试根据某些条件调整放置在 UITableViewCell 内的 UIButton 的一些约束。

我在数据源方法cellForRowAtIndexPath 中执行此操作。但是,似乎我的单元格的框架总是以(0, 0, 0, 0) 的形式返回,这意味着我无法获得任何子视图的约束来调整它们,除非我滚动。

我的尝试

我有created and uploaded a simple project 试图解决这个问题。这是来自cellForRowAtIndexPath的代码:

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

    TestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    cell.label.text = [NSString stringWithFormat:@"%lu", indexPath.row];

    NSLog(@"CELL FRAME: %f, INDEXPATH: %lu, CONSTRAINTS: %lu", CGRectGetWidth(cell.frame), indexPath.row, cell.label.constraints.count);

    return cell;

结果

当我运行项目时,我看到以下日志:

CELL FRAME WIDTH: 0.000000, INDEXPATH: 0, CONSTRAINTS: 0

但是,一旦我滚动,我开始看到类似的东西:

CELL FRAME WIDTH: 320.000000, INDEXPATH: 7, CONSTRAINTS: 2

问题

我在这里做错了什么?如何获得单元格子视图的约束来调整它们,而不必先滚动?

提前致谢。

【问题讨论】:

【参考方案1】:

调整tableView:willDisplayCell:forRowAtIndexPath:方法中的单元格。

cellForRowAtIndexPath: 方法中,尚未设置单元格的框架,并且尚未将单元格添加到表格视图中。太早了。

最好将责任放在TestCell 类的实现中。

【讨论】:

非常感谢您的回答。使用willDisplayCell 现在我似乎可以正确获取框架,但约束仍然返回为 0。有什么想法吗? 没关系。我没有正确设置约束。一旦我修复了我的约束,它们也开始表现得很好。谢谢!【参考方案2】:

你试图过早地观察。此时单元格不应具有适当的帧。在调用cellForRowAtIndexPath' 之后,tableview 仍然可以在后台工作以调整单元格的大小,这将导致帧发生变化。

尝试使用tableView:willDisplayCell:forRowAtIndexPath: 进行此调用

【讨论】:

非常感谢您的回答。使用willDisplayCell,现在我似乎可以正确获取框架,但约束仍然返回为 0。有什么想法吗? 没关系。我没有正确设置约束。一旦我修复了我的约束,它们也开始表现得很好。谢谢! +1

以上是关于无法在 cellForRowAtIndexPath 中获取单元格框架或约束的主要内容,如果未能解决你的问题,请参考以下文章

Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束

从情节提要加载 UILabel,无法更改 cellForRowAtIndexPath 中的框架

在 cellForRowAtIndexPath 中将 UIButton 视为 UILabel

cellForRowAtIndexPath 是如何工作的?

reloadData 没有调用 cellForRowAtIndexPath

Swift:cellForRowAtIndexPath 未按 indexPaths 的顺序调用