2009-05-16 2 views
5

sto sovraccaricare il metodo delegato -tableView:heightForRowAtIndexPath: e utilizzando -sizeWithFont:constrainedToSize: per impostare a livello di codice l'altezza della cella, in base al testo in quella cella:Ripristino personalizzato UITableViewCell altezza quando iPhone è ruotato

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

questo funziona quando il tavolo è prima disegnato. Tuttavia, quando cambio l'orientamento del dispositivo, da verticale a orizzontale, l'altezza della cella non cambia.

ho provato l'override del metodo -shouldAutorotateToInterfaceOrientation: nel mio controller vista tabella:

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

Questo dovrebbe ricaricare i dati della tabella e (presumibilmente) ridisegnare il panorama delle celle della tabella. Ma questo non ha alcun effetto.

C'è un modo per forzare una cella a ridisegnare con una nuova altezza, quando il dispositivo viene ruotato?

EDIT: Ho provato quanto segue, a nessun effetto:

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

Ecco ciò che l'applicazione si presenta come orientamento verticale:

Portait

Ecco ciò che l'applicazione assomiglia all'orientamento orizzontale:

Landscape

C'è uno spazio tra i bordi superiore e inferiore del contenuto.

EDIT 2:

Regolazione il parametro di dimensione tramite la larghezza del telaio del tavolo aiutato risolvere il problema di visualizzazione:

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

risposta

6

È meno che ottimale, ma la soluzione più semplice è chiamare -reloadData sulla tavolo.

Una soluzione migliore sarebbe quella di chiamare -beginUpdates, -deleteRowsAtIndexPaths:withRowAnimation:, -insertRowsAtIndexPaths:withRowAnimation: e -endUpdates o semplicemente -reloadSections:withRowAnimation: se il targeting solo 3.0. Questo aggiungerà animazione.

Edit: E avrete anche bisogno di una vera e propria 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; 
} 

(dove textForRowAtIndexPath: è un metodo che restituisce il testo della cella)

+0

ho provato -reloadData. –

+0

Ho provato -reloadSections: withRowAnimation: nel -shouldAutorotateToInterfaceOrientation: metodo e anche questo non funziona. –

+0

Questi funzionano tutti se chiamati dopo che la vista è stata ridimensionata. Ciò significa che dovrebbero essere nel tuo fattoRotateFromInterfaceOrientation: – rpetrich