Получение реальной ширины ячейки табличного представления во время -tableView: heightForRowAtIndexPath: когда присутствует индекс раздела - PullRequest
13 голосов
/ 05 сентября 2010

Подходящая высота для моих пользовательских UITableViewCells зависит от их ширины.К сожалению, трудно узнать фактическую ширину области содержимого ячейки в -tableView:heightForRowAtIndexPath:, поскольку единственная информация, с которой мне приходится работать, - это просмотр таблицы.Несколько факторов могут изменить ширину контента, поэтому она не равна tableView.bounds.size.width;единственное, с чем я сейчас борюсь, это индекс раздела.(Другое, если табличное представление сгруппировано.)

Есть ли общий способ получить ширину содержимого ячейки только из tableView?

В противном случае, есть ли способ получитьширина индекса раздела, чтобы я мог вычесть его из ширины границ?(Я не хочу жестко кодировать его, так как он не будет переносимым между устройствами.)

Примечание. Это не дублирование Требуется доступ к ячейке в tableView: heightForRowAtIndexPath: потому что решение есть только в использовании границ.Это также не дублирование Получить tableView: heightForRowAtIndexPath: должно произойти после tableView: cellForRowAtIndexPath:? , поскольку существует решение жестко закодировать константу (265.0), которая не переносима на устройства.

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Вот что у меня получилось.Это некрасиво, но работает, по крайней мере, во всех случаях, которые я смог найти.

- (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;  
}
0 голосов
/ 25 апреля 2013

Хорошо, чтобы сэкономить другим людям несколько часов работы .... Я тщательно протестировал различные шрифты, размеры и поля, сравнивая их с дампом иерархии UIView фактического табличного представления с индексом, чтобы прийти к этому методу, который вернет ширину индекса таблицы, так что границы содержимого ячейки табличного представления можно рассчитать как table_width - index_width. Я укажу, что часто есть дополнительное количество в 20 пикселей справа, зарезервированное для дополнительного вида.

Я также обнаружил, что cell.contentView.bounds НЕ устанавливается правильно, пока не будут вызваны методы AFTER cellForRowAtIndexPath и willDisplayCell, поэтому попытка получить значение во время этих вызовов обречена на неудачу. Он устанавливается правильно ко времени вызова viewDidAppear.

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

- (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...