无法在 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