自定义 UITableViewCell 子视图布局

Posted

技术标签:

【中文标题】自定义 UITableViewCell 子视图布局【英文标题】:Custom UITableViewCell subview layout 【发布时间】:2010-09-16 20:56:40 【问题描述】:

我正在创建一个自定义的UITableViewCell,其风格类似于UITableViewCellStyleValue1,但右侧有一个可编辑的文本字段,而不是detailTextLabel。我对如何正确调整编辑字段的大小有点困惑。我想考虑textLabel 的长度以及contentView 的大小,并且当它的表格视图处于编辑模式时,或者如果附件视图(如添加了披露箭头)。

contentView 的宽度似乎总是 320(在 iPhone 的纵向模式下),即使对于分组表也是如此。在我的UITableViewCell 子类中,我看不到访问它所属的表格视图的方法,因此我可以获取表格的样式并相应地调整边距。

我认为我可以在 tableView 的委托 -tableView:willDisplayCell:forRowAtIndexPath: 方法中以自定义方式处理此问题,但这完全违背了拥有可重用单元类的目的。

我必须在这里遗漏一些关键概念,但我不知所措。有人吗?

谢谢! 兰迪

【问题讨论】:

【参考方案1】:

您可能希望在 UITableViewCell 子类中控制布局。例如:

- (void)layoutSubviews

    CGRect b = [self bounds];
    b.size.width += 30; // allow extra width to slide for editing
    b.origin.x -= (self.editing) ? 0 : 30; // start 30px left unless editing
    [contentView setFrame:b];
    // then calculate (NSString sizeWithFont) and addSubView, the textField as appropriate...
    // 
    [super layoutSubviews];

【讨论】:

我错过了 [super layoutSubviews];那些对我来说预先大小的东西。谢谢,乔丹。【参考方案2】:

我认为边距是单元格的一部分,而不是表格,所以这就是 contentView 总是 320 宽的原因。可能我没看懂问题。

【讨论】:

如果表格视图是普通样式,从视觉上看,单元格占据了表格的整个宽度。但是,在分组样式中,视觉上,两边都有 10 像素的边距。但是,在单元格子类中,我如何确定是否在任一侧使用这额外的 10 像素边距? 哦,我不确定。尝试检查indendationLevelindentationWidth,它们在分组和普通上可能不同。

以上是关于自定义 UITableViewCell 子视图布局的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 子视图不遵守自动布局约束

点击单元格后不同的 UITableViewCell 子视图布局

何时何地根据实际宽度更新 UITableViewCell 子视图的约束

##DAY12 UITableViewCell自定义

使用 AutoLayout 更新 UITableViewCell 子视图的框架

自定义 UITableViewCell 的布局何时完成?