Получение реальной ширины ячейки tableview во время -tableView: heightForRowAtIndexPath: при наличии индекса раздела
Правильная высота моего пользовательского UITableViewCells зависит от их ширины. К сожалению, трудно узнать фактическую ширину области содержимого ячейки в -tableView:heightForRowAtIndexPath:
, так как единственной информацией, с которой я должен работать, является tableview. Несколько факторов могут изменить ширину содержимого, чтобы он не был равен tableView.bounds.size.width
; тот, с которым я сейчас борюсь, - это индекс раздела. (Другой - если таблица tableview сгруппирована.)
Есть ли хороший способ получить ширину содержимого ячейки только из таблицыView?
В противном случае, есть ли способ получить ширину индекса раздела, чтобы я мог вычесть его из ширины границ? (Я не хочу его жестко кодировать, так как это не будет переноситься через устройства.)
Примечание. Это не дубликат Нужно получить доступ к ячейке в таблицеView: heightForRowAtIndexPath:, потому что решение есть только для использования границ. Это также не окупит Get tableView: heightForRowAtIndexPath: произойдет после tableView: cellForRowAtIndexPath:?, так как для решения необходимо жестко закодировать константу (265.0), которая isn ' t переносится через устройства.
Ответы
Ответ 1
Вот что я получил. Это уродливо, но это работает, по крайней мере, во всех случаях, которые я мог найти.
- (CGFloat)sectionIndexWidthForSectionIndexTitles:(NSArray *)titles {
UIFont *sectionIndexFont = [UIFont fontWithName:@"Helvetica-Bold" size:14.0f];
CGFloat maxWidth = CGFLOAT_MIN;
for(NSString *title in titles) {
CGFloat titleWidth = [title sizeWithFont:sectionIndexFont].width;
maxWidth = MAX(maxWidth, titleWidth);
}
CGFloat sectionIndexWidth = 0.0f;
NSUInteger maxWidthInt = (int)maxWidth;
switch(maxWidthInt) {
case 0:
sectionIndexWidth = 0.0f;
break;
case 11:
sectionIndexWidth = 30.0f;
break;
case 12:
sectionIndexWidth = 31.0f;
break;
case 14:
sectionIndexWidth = 32.0f;
break;
default:
sectionIndexWidth = 0.0f;
break;
}
return sectionIndexWidth;
}
Ответ 2
Хорошо, чтобы сохранить других людей в течение нескольких часов работы... Я тщательно тестировал различные шрифты, размеры и поля, сравнивая их с дампом иерархии UIView фактического представления таблицы с индексом, чтобы получить этот метод, который вернет ширину индекса таблицы, так что границы содержимого ячейки представления таблицы можно вычислить как table_width - index_width. Я укажу, что для дополнительного аксессуара часто требуется еще 20 пикселов с правой стороны.
Я также обнаружил, что cell.contentView.bounds НЕ установлен правильно до тех пор, пока не будут вызваны вызовы cellForRowAtIndexPath и willDisplayCell, поэтому попытка захватить значение во время этих вызовов обречена на провал. Он корректно задан по представлению timeDidAppear.
Я не знаю, как вычислить ширину индекса, если язык устройства установлен для неанглийского алфавита.
- (CGFloat) getMaxIndexViewWidth
{
CGFloat indexMargin = 21.0;
NSArray *sectionTitles = [self sectionIndexTitlesForTableView:nil]; //NOTE -- if multiple tables, pass real one in
CGFloat maxWidth11 = CGFLOAT_MIN;
for(NSString *title in sectionTitles)
{
CGFloat titleWidth11 = [title sizeWithFont:[UIFont fontWithName:@"Helvetica-Bold" size:11.0f]].width;
maxWidth11 = MAX(maxWidth11, titleWidth11);
}
return maxWidth11+indexMargin;
}