Как надежный подкласс UITableViewCell для сгруппированного UITableView?

При написании настраиваемого подкласса UITableViewCell, я нахожу, что результаты хорошо работают для прямоугольных ячеек с обычным стилем UITableView, но не работают вообще для округленных ячеек в таблице сгруппированным стилем.

Есть ли способ надежно подкласса UITableViewCell рисовать ячейки, которые работают для таблиц сгруппированных стилей? (Без использования Interface Builder.)

Ответ 1

Может ли ответ быть таким простым, как первый вызов [super layoutSubviews] внутри вашего подкласса UITableViewCell layoutSubviews?

Вот мой код.

Сначала я создаю UITextField и добавляю его к contentView в методе initWithStyle::

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        inputField = [[UITextField alloc] initWithFrame:CGRectZero];
        [self.contentView addSubview:inputField];
        inputField.borderStyle = UITextBorderStyleLine;
        [inputField release];
    }
    return self;
}

Затем в layoutSubviews Ive получил следующее:

-(void)layoutSubviews
{
    inputField.frame = CGRectMake(5, 5, 100, 20);
}

С этим кодом текстовое поле имеет 5 пикселей слева от экрана, что, конечно, 5 пикселей слева от ячейки таблицы, когда оно находится в сгруппированном режиме. Другими словами, ВНЕШНЯЯ ячейка таблицы. Нехорошо.

Используйте этот код, а inputField размещен на 5 пикселей справа от ячейки, как будто я хочу:

-(void)layoutSubviews
{
    [super layoutSubviews]; // the magic line
    inputField.frame = CGRectMake(5, 5, 100, 20);
}

Я мог бы полностью неправильно понять проблему, которую вы имели, хотя!

Эрик

Ответ 2

У меня было много проблем с подклассами UITableViewCell, но потом я просто прекратил подклассы. Добавление subviews в свойство contentView объекта UITableViewCell, похоже, выполняет ту же самую вещь в любом экземпляре, с которым я столкнулся, поэтому я просто делаю это внутри моего UITableViewController.

Вот пример, который имеет заголовок и значение:

- (UITableViewCell *)tableView:(UITableView*)tableView 
         cellForRowAtIndexPath: (NSIndexPath*)indexPath 
{    
    static NSString* CellIdentifier = @"AccountDetailsCell";
    UILabel* mainLabel = nil;
    UILabel* valueLabel = nil;
    const CGFloat kAccountDetailFontSize = 14.0;

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
    if ( cell == nil ) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault 
                                       reuseIdentifier: CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake( 10.0, 0.0, 150.0, 44.0 )] autorelease];
        mainLabel.tag = MAINLABEL_TAG;
        mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize];
        mainLabel.textAlignment = UITextAlignmentLeft;
        mainLabel.textColor = [UIColor darkGrayColor];
        mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
        mainLabel.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview: mainLabel];

        valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake( 150.0, 0.0, 150.0, 44.0 )] autorelease];
        valueLabel.tag = VALUELABEL_TAG;
        valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize];
        valueLabel.textAlignment = UITextAlignmentRight;
        valueLabel.textColor = [UIColor darkTextColor];
        valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        valueLabel.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview: valueLabel];
    }
    else
    {
        mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG];
        valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG];
    }

    mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row];
    valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath];

    return cell;
}

Ответ 3

Я тоже заметил эту проблему. Мое обходное решение состояло в том, чтобы просто уменьшить размер моих ячеек таблицы (ширина 300 вместо 320). Это не отличное решение, но оно работает хорошо.

Я не верю, что вы можете избавиться от вставки табличного представления на индивидуальной основе в режиме "группировки". Я мог ошибаться, хотя!

Ответ 4

Какая у вас проблема? В drawRect вам дается право, и вы знаете свой общий размер - просто соглашайтесь с этим пространством. Если вы используете layoutSubviews, то же самое.