Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't indent UITableViewCell subclass

I have subclassed UITableViewCell to create a custom cell with a button and 2 labels. The cell definition is loaded from a xib using the pattern outlined in Dave Mark's Beginning iPhone Development. Here's the essential code:

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

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

The labels and button display as expected but the indentation level is not respected. I have implemented indentationLevelForRowAtIndexPath like below, but the cell is still aligned all the way to the left.

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

Note that the indentation level works fine when I'm not using a custom cell.

Any hints?

like image 478
Daniel Avatar asked Sep 15 '10 01:09

Daniel


2 Answers

Update for iOS 8: The code below no longer works for some reason

Alternate suggestion for iOS 8:

Consider creating an AutoLayout constraint to represent the indenting left margin

At runtime, modify this constraint to change the indent level

If you have a custom UITableViewCell subclass, this subclass can have an IBOutlet mapped to the constraint. (Unfortunately Apple did not provide a findConstraintByTag/Id function)

The ironically named "constant" property of the NSLayoutConstraint can be modified to change the indent level.

For iOS 7, this works (but should no longer be recommended)

Based on vodkhang's suggestion, I implemented the following solution in my UITableViewCell sublass. Not sure if this is the best solution but it appears to work fine.

- (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);
}
like image 136
Daniel Avatar answered Nov 19 '22 12:11

Daniel


I think that you need to customize the indentation level in your custom UITableViewCell. I guess this method (and methods like – tableView:heightForRowAtIndexPath:) will not affect in the case of UITableViewCell if your custom UITableViewCell already specified it

like image 37
vodkhang Avatar answered Nov 19 '22 11:11

vodkhang