无法缩进UITableViewCell子类

时间:2010-09-15 01:08:18

标签: iphone uitableview indentation

我已经将UITableViewCell子类化为创建一个带有按钮和2个标签的自定义单元格。使用Dave Mark的Beginning iPhone Development中概述的模式从xib加载单元定义。这是基本代码:

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MarketItemCustomCell" owner:self options:nil];

    for (id oneObject in nib)
    {
        if ([oneObject isKindOfClass:[MarketItemCustomCell class]])
        {
            cell = (MarketItemCustomCell *)oneObject;
            break;
        }
    }

标签和按钮按预期显示,但不遵守缩进级别。我已经实现了如下所示的indentationLevelForRowAtIndexPath,但是单元格仍然一直向左对齐。

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        <snip/>
        return 5;
    }

请注意,当我不使用自定义单元格时,缩进级别可以正常工作。

任何提示?

3 个答案:

答案 0 :(得分:21)

iOS 8更新:以下代码由于某种原因不再有效

iOS 8的替代建议:

考虑创建一个AutoLayout约束来表示缩进左边距

在运行时,修改此约束以更改缩进级别

如果您有自定义UITableViewCell子类,则此子类可以将IBOutlet映射到约束。 (不幸的是Apple没有提供findConstraintByTag / Id功能)

可以修改NSLayoutConstraint的具有讽刺意义的“常量”属性来更改缩进级别。

对于iOS 7,这有效(但不应再推荐)

根据vodkhang的建议,我在UITableViewCell子类中实现了以下解决方案。不确定这是否是最佳解决方案,但似乎工作正常。

- (void)layoutSubviews
{
    [super layoutSubviews];

    float indentPoints = self.indentationLevel * self.indentationWidth;

    self.contentView.frame = CGRectMake(indentPoints,
                                          self.contentView.frame.origin.y,
                                          self.contentView.frame.size.width - indentPoints, 
                                          self.contentView.frame.size.height);
}

答案 1 :(得分:1)

我认为您需要在自定义UITableViewCell中自定义缩进级别。我猜这个方法(和像– tableView:heightForRowAtIndexPath:这样的方法)在UITableViewCell的情况下不会影响你的自定义UITableViewCell已经指定了它

答案 2 :(得分:0)

如果在xib中设计UITableViewCell,则将使用customView单元属性,该属性不会自动使用缩进。您可以继承UITableViewCell并实现layoutSubviews以根据缩进更改框架,或者您可以在表委托或数据源中配置单元格的任何位置执行相同操作。我希望Apple为自定义单元格实现缩进。