2009-05-16 4 views
5

Я перегружать метод делегата -tableView:heightForRowAtIndexPath: и используя -sizeWithFont:constrainedToSize: программно установить высоту ячейки, на основе текста в этой ячейке:Сброс пользовательских UITableViewCell высоты при iPhone повернут

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    switch (indexPath.section) { 
    case(kAboutViewOverviewSection): { 
     switch (indexPath.row) { 
     case(kAboutViewOverviewSectionRow): { 
      NSString *text = NSLocalizedString(@"kAboutViewOverviewSectionFieldText", @""); 
      CGSize s = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280, 500)]; 
      return s.height + 13; 
     } 
     default: { 
      break; 
     } 
     } 
     break; 
    } 
    default: { 
     break; 
    } 
    } 
    return 44.0; 
} 

Это работает, когда таблица сначала нарисован. Однако, когда я изменяю ориентацию устройства, от портретного до пейзажа, высота ячейки не изменяется.

Я попытался переопределение метода -shouldAutorotateToInterfaceOrientation: в моем контроллере представления таблицы:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    [self.tableView reloadData]; 
    return YES; 
} 

Это должно перезагружать данные таблицы и (предположительно) перерисовывать мнения ячеек таблицы. Но это не имеет никакого эффекта.

Есть ли способ заставить ячейку перерисовать с новой высотой, когда устройство повернуто?

EDIT: Я попытался следующие, никакого эффекта:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    [self.tableView reloadData]; 
} 

Вот что приложение выглядит как в портретной ориентации:

Portait

Вот что приложение выглядит как в альбомной ориентации:

Landscape

Промежуток между верхним и нижним краями содержимого.

РЕДАКТИРОВАТЬ 2:

Регулировка параметра размера с помощью ширины таблицы фрейма помогло устранить эту проблему отображения:

CGSize s = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake([tableView frame].size.width,500)]; 

ответ

6

Это меньше, чем оптимальное, но самым простым решением является вызов -reloadData на Таблица.

Лучшим решением было бы назвать -beginUpdates, -deleteRowsAtIndexPaths:withRowAnimation:, -insertRowsAtIndexPaths:withRowAnimation: и -endUpdates или просто -reloadSections:withRowAnimation: если они нацелены на 3.0 только. Это добавит анимацию.

Edit: И вы будете также нуждаться в надлежащей tableView:heightForRowAtIndexPath:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGSize textSize = [[self textForRowAtIndexPath:indexPath] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake([tableView frame].size.width - 20, 500)]; 
    return textSize.height + 13.0f; 
} 

(где textForRowAtIndexPath: это метод, который возвращает текст ячейки)

+0

Я попытался -reloadData. –

+0

Я попытался -reloadSections: withRowAnimation: в -shouldAutorotateToInterfaceOrientation: метод, и это тоже не сработает. –

+0

Все они работают, если вызваны после изменения размера представления. Это означает, что они должны быть в вашем didRotateFromInterfaceOrientation: – rpetrich

Смежные вопросы