UITableViewCell 框架仅在滚动后更新

Posted

技术标签:

【中文标题】UITableViewCell 框架仅在滚动后更新【英文标题】:UITableViewCell's frame only updated after scrolling 【发布时间】:2015-07-20 16:00:31 【问题描述】:

我根据代码更改单元格的框架(在左侧和右侧添加边距)。问题是单元格只有在它们消失并通过滚动再次出现后才会更新它们的框架。我也使用了表格视图的 - reloadData,但它没有帮助。如何在不滚动的情况下强制重绘单元格?

- (UITableViewCell *) tableView: (UITableView *) tableView
      cellForRowAtIndexPath: (NSIndexPath *) indexPath 
PersonTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"TableViewCellID"
                                                            forIndexPath: indexPath];

cell.frame = CGRectMake(20, cell.frame.origin.y, cell.frame.size.width-2*20, cell.frame.size.height);

/* tried any of those
[cell setNeedsDisplay];
[cell setNeedsLayout];
[cell layoutIfNeeded];
*/
return cell;

【问题讨论】:

同时发布您的dequeue cell 代码 【参考方案1】:

我建议为此使用 .xibs。容易得多。

据我所知,您无法以这种方式更改单元格的框架。 cell的高度由heightForRowAtIndexPath决定,宽度设置为tableView的宽度。

您可能能够以您尝试的方式以某种方式做到这一点,但我所知道的最干净的方式如下。

如果您希望单元格周围有一个边距,您可以:

UITableViewCell 创建一个包含所有视图的UIView 的笔尖,并使用约束放置边框。 将所有内容嵌入UIView(我们称之为borderedContentView)并将其作为contentView 的直接子视图 放置与borderedContentViewcontentView 相关的约束,并将前导、尾随、顶部和底部约束设置为创建所需边框宽度的值。 如果你的tableView有一个backgroundColor,你必须将contentViewbackgroundColor设置为与tableViewbackgroundColor相同的颜色,以创建一个margin的错觉.在tableView 的委托方法willDisplayCell:UITableViewCell 的子类awakeFromNib 或其他相关方法中执行此操作。 沉浸在边缘单元格的荣耀中。

如果您不喜欢使用界面生成器,您也可以通过编程方式执行此操作,但在 IB 中很容易做到。

希望这会有所帮助。

【讨论】:

【参考方案2】:

解决问题的方法是覆盖 UITableViewCell的setFrame方法。这样就完美运行了。

【讨论】:

以上是关于UITableViewCell 框架仅在滚动后更新的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 只在滚动后显示附件

滚动时更新 UITableViewCell

UITableViewCell 在位置回调后不更新,直到滚动或选择

UITableView动态单元格高度仅在某些滚动后才能正确显示

Swift - tableView 行高仅在滚动或切换展开/折叠后更新

Swift UITableViewCell 滚动时按钮状态更改