Как получить ширину contentView UITableViewCell?
Мне нужно создать пользовательскую ячейку в таблице UITableViewStyleGrouped. Она должна выглядеть как UITableViewCellStyleValue1, если textLabel и detailTextLabel показаны без усечения или как UITableViewCellStyleSubtitle (но с detailTextLabel width = contentView.frame.size.width и UITextAlignmentRight), если в стиле Value1 один из меток усечен.
Мне нужно знать ширину cell.contentView в методе - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
, чтобы решить, какой должна быть высота ячейки. Я сравниваю cell.contentView.width и сумму ширины меток (я получаю их с помощью метода sizeThatFits:
), чтобы решить его.
Итак, как получить правильный cell.contentView.frame.size.width перед созданием ячейки?
UPD: некоторый код для уточнения вопроса.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat cellHeight = 44;
CGSize textSize = [[arrayOfTextData objectAtIndex:indexPath.row]
sizeWithFont:[UIFont systemFontOfSize:14]
constrainedToSize:CGSizeMake( 1000, 100)
lineBreakMode:UILineBreakModeCharacterWrap];
CGSize detailedTextSize = [[arrayOfDetailTextData objectAtIndex:indexPath.row]
sizeWithFont:[UIFont systemFontOfSize:14]
constrainedToSize:CGSizeMake(1000, 100)
lineBreakMode:UILineBreakModeCharacterWrap];
if (textSize.width + detailedTextSize.width > /* I need here cell.contentView.frame.size.width*/ 300) {
cellHeight = textSize.height + detailedTextSize.height;
}
return cellHeight;
}
UPD2: Проблема заключается в том, что при создании ячейки cell.contentView.frame.size.width равно cell.frame.size.width и равной 320, но после того, как ячейка появилась cell.contentView. frame.size.width изменяется в зависимости от ширины таблицы и стиля tableView.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"tmpCell";
CustomTableViewCellValue1OrSubtitle *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CustomTableViewCellValue1OrSubtitle alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}
//--Configure the cell
cell.textLabel.text = [arrayOfTextData objectAtIndex:indexPath];
cell.detailTextLabel.text = [arrayOfDetailTextData objectAtIndex:indexPath.row];
[cell layoutIfNeeded];
CGSize textSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode];
CGSize detailedTextSize = [cell.detailTextLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode];
CGFloat cellHeight = cell.contentView.frame.size.height;
NSLog(@"contentView.frame.size.width = %f",cell.contentView.frame.size.width);
//out: contentView.frame.size.width = 320.0
//Always print 320, even if I set Simulator on iPad
if (textSize.width + detailedTextSize.width > cell.contentView.frame.size.width) {
cellHeight = textSize.height + detailedTextSize.height;
}
return cellHeight;
}
Ответы
Ответ 1
Если я не ошибаюсь, heightForRowAtIndexPath: вызывается либо до, либо справа после инициализации ячейки, поэтому нет времени для изменения размера.
Это должно сработать для вас:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%f", cell.contentView.frame.size.width);
}
К сожалению, это вызывается после heightForRowAtIndexPath. Единственный способ, которым я нашел настройку высоты, основанной на непостоянной ширине, - установить переменную экземпляра для ширины при первом вызове этого метода, затем перезагрузить представление таблицы и использовать переменную экземпляра ширины внутри heightForRowAtIndexPath.
Ответ 2
Ширина contentView
ячейки в UITableViewStyleGrouped
UITableView
не устанавливается, когда ячейка создана, поэтому вы можете установить autoresizingMask
для метки, например:
label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
Для меня это работало.
Ответ 3
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
return 60.0f;
else
return 50.0f;
}
Применяя это, вы можете установить ячейку → contentView. И если вам нужна динамическая ширина ячейки, используйте флаг выше метода