2009-05-16 7 views
5

Je suis SURCHARGE la méthode déléguée -tableView:heightForRowAtIndexPath: et en utilisant -sizeWithFont:constrainedToSize: définir par programmation la hauteur de la cellule, en fonction du texte dans cette cellule:Remise à zéro sur mesure UITableViewCell la hauteur lorsque l'iPhone est tourné

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

Cela fonctionne lorsque la table est d'abord dessiné. Cependant, lorsque je change l'orientation de l'appareil, de portrait en paysage, la hauteur de la cellule ne change pas.

J'ai essayé redéfinissant la méthode -shouldAutorotateToInterfaceOrientation: selon moi la table contrôleur:

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

Cela devrait recharger les données de la table et (probablement) redessiner les vues de cellules de table. Mais cela n'a aucun effet.

Existe-t-il un moyen de forcer une cellule à redessiner avec une nouvelle hauteur, lorsque l'appareil est pivoté?

EDIT: J'ai essayé ce qui suit, sans effet:

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

Voici ce que l'application ressemble en orientation portrait:

Portait

Voici ce que l'application ressemble à l'orientation paysage:

Landscape

Il existe un espace entre les bords supérieur et inférieur du contenu.

EDIT 2:

Réglage du paramètre de taille par la largeur du cadre de la table a contribué à résoudre ce problème d'affichage:

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

Répondre

6

Il est loin d'être optimale, mais est d'appeler la solution la plus simple -reloadData sur la table.

Une meilleure solution serait d'appeler -beginUpdates, -deleteRowsAtIndexPaths:withRowAnimation:, -insertRowsAtIndexPaths:withRowAnimation: et -endUpdates ou simplement -reloadSections:withRowAnimation: si le ciblage 3.0 uniquement. Cela va ajouter une animation.

Edit: Et vous aurez également besoin d'un bon 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; 
} 

(où textForRowAtIndexPath: est une méthode qui renvoie le texte de la cellule)

+0

J'ai essayé -reloadData. –

+0

J'ai essayé -reloadSections: withRowAnimation: dans la méthode -shouldAutorotateToInterfaceOrientation: et cela ne fonctionne pas non plus. –

+0

Tout cela fonctionne s'il est appelé après que la vue a été redimensionnée. Cela signifie qu'ils devraient être dans votre didRotateFromInterfaceOrientation: – rpetrich

Questions connexes