Как надежный подкласс 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, то же самое.