2009-05-16 13 views
5

ja przeciążenia metody delegata -tableView:heightForRowAtIndexPath: i korzystania -sizeWithFont:constrainedToSize: programowo ustawić wysokość komórki, na podstawie tekstu w komórce:Resetowanie niestandardowych UITableViewCell wysokość, gdy iPhone jest obracany

- (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; 
} 

Działa gdy stół jest najpierw narysowany. Jednak po zmianie orientacji urządzenia, z pionowej na poziomą wysokość komórki się nie zmienia.

próbowałem przesłanianie metody -shouldAutorotateToInterfaceOrientation: w moim stole widoku kontrolera:

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

ten powinien przeładować dane tabeli i (przypuszczalnie) przerysować poglądy komórka tabeli. Ale to nie ma żadnego efektu.

Czy istnieje sposób na wymuszenie odświeżania komórki z nową wysokością, gdy urządzenie jest obracane?

EDIT: Próbowałem następujące, bez skutku:

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

Oto co aplikacja wygląda jak w orientacji pionowej:

Portait

Oto co aplikacja wygląda jak w orientacji poziomej:

Landscape

Występuje luka między górną i dolną krawędzią treści.

EDIT 2:

Regulacja parametru size poprzez szerokości ramy stołu pomógł rozwiązać ten problem wyświetlania:

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

Odpowiedz

6

to mniej niż optymalna, ale najprostszym rozwiązaniem jest zadzwonić -reloadData na stół.

Lepszym rozwiązaniem byłoby zadzwonić -beginUpdates, -deleteRowsAtIndexPaths:withRowAnimation:, -insertRowsAtIndexPaths:withRowAnimation: i -endUpdates lub po prostu -reloadSections:withRowAnimation: jeśli kierowania 3.0 tylko. To doda animację.

Edit: I będzie trzeba także właściwa 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; 
} 

(gdzie textForRowAtIndexPath: to metoda, która zwraca tekst komórki)

+0

Próbowałem -reloadData. –

+0

Próbowałem -reloadSections: withRowAnimation: w metodzie -shouldAutorotateToInterfaceOrientation: metoda i to nie działa, albo. –

+0

Te wszystkie działają, jeśli zostaną wywołane po zmianie rozmiaru widoku. Oznacza to, że powinny znajdować się w Twojej usłudze didRotateFromInterfaceOrientation: – rpetrich

Powiązane problemy