Получение реальной ширины ячейки 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;
}