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

时间:2015-01-03 17:39:58

标签: ios objective-c uitableview autolayout

问题

我正在尝试根据某些条件调整放置在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

问题

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

提前致谢。

2 个答案:

答案 0 :(得分:10)

使用tableView:willDisplayCell:forRowAtIndexPath:方法调整单元格。

cellForRowAtIndexPath:方法中,单元格的框架尚未设置,单元格尚未添加到表格视图中。现在还为时过早。

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

答案 1 :(得分:3)

你想过早观察。此时不希望该单元具有适当的帧。在调用cellForRowAtIndexPath'之后,tableview仍然可以在底层工作以调整单元格的大小,这将导致帧更改。

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