2010-04-17 4 views
1

J'ai ajouté l'interfaceOrientation à mon application. Cela fonctionne bien concernant les points de vue. Certaines des cellules de table que j'ai définies par CGRects pour positionner le texte dans la cellule. En mode portrait, la cellule a une longueur de 300 pixels, en mode paysage 420 pixels. J'utilise le code suivant pour changer les CGRects selon l'orientation:cellules "reset" après changement d'orientation

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (self.interfaceOrientation == UIDeviceOrientationPortrait) { 
     NSString *currentLanguage = [[NSString alloc] initWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/sprache.txt"]]; 
     static NSString *TableViewTableCellIdentifier = @"TableViewTableCellIdentifier"; 
     UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:TableViewTableCellIdentifier]; 

     CGRect cellRect = CGRectMake(0, 0, 300, 175); 
     cell.backgroundColor = [UIColor darkGrayColor]; 
     cell = [[[UITableViewCell alloc] initWithFrame:cellRect reuseIdentifier:TableViewTableCellIdentifier] autorelease]; 

     CGRect keyLabelRect = CGRectMake(0, 5, 5, 20); 
     UILabel *keyLabel = [[UILabel alloc]initWithFrame:keyLabelRect]; 
     keyLabel.tag = 100; //......... 
    } else { 
     NSString *currentLanguage = 
      [[NSString alloc] initWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/sprache.txt"]]; 
     static NSString *TableViewTableCellIdentifier = @"TableViewTableCellIdentifier"; 

     UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:TableViewTableCellIdentifier]; 

     CGRect cellRect = CGRectMake(0, 0, 450, 175); 
     cell.backgroundColor = [UIColor darkGrayColor]; 
     cell = [[[UITableViewCell alloc] initWithFrame:cellRect reuseIdentifier:TableViewTableCellIdentifier] autorelease]; 

     CGRect keyLabelRect = CGRectMake(0, 5, 5, 20); 
     UILabel *keyLabel = [[UILabel alloc] //..... 
    } 
} 

Mon problème est, lorsque la table est visible et l'orientation est modifiée, je dois faire défiler pour voir la nouvelle « mise en page ». Comment puis-je "recharger" la vue après avoir changé l'orientation?

Répondre

1

Tout d'abord, cela va fuir comme un fou. Vous créez des cellules et les supprimez, mais vous ne les libérez jamais. Vous venez de créer une cellule entièrement nouvelle chaque fois qu'une cellule est demandée. Il n'y a aucune raison de recréer une cellule si vous la supprimez et vice versa. Plus important encore, vous créez autant de cellules que vous avez de lignes dans votre table logique. Cela va manger toute votre mémoire très rapidement.

Lorsque vous supprimez une cellule, vous devez vérifier si sa taille est correcte et la réutiliser si elle l'est. Si ce n'est pas le cas, vous devez libérer la cellule et en créer une autre. Deuxièmement, une table ne demandera pas de nouvelles cellules jusqu'à ce que vous faites défiler les cellules existantes hors de l'écran. C'est pourquoi vos cellules ne changent pas tant que vous ne faites pas défiler. C'est le comportement attendu d'une tableview.

Ma recommandation permanente pour toute vue modérément complexe est d'utiliser différentes paires vue/contrôleur/vue pour chaque orientation. Il semble que plus de travail mais généralement je trouve que ça prend moins et c'est plus facile à gérer. Dans ce cas, avoir deux tables séparées vous évitera probablement beaucoup de chagrin.

+0

Votre recommandation avec différents view-controllers fonctionne correctement. Merci. Mais comment gérez-vous quand l'utilisateur change d'orientation? Je choisis dans le viewcontroller0 l'orientation: portrait -> viewControllerA, landscape -> viewControllerB. Par exemple, viewControllerA a été sélectionné, puis l'utilisateur a changé son orientation. Il doit quitter le viewControllerA actuel et le viewControllerB correct sera choisi. – Christian

+0

Dans la méthode 'willRotateToOrientation' de chaque contrôleur, vous poussez le contrôleur de vue pour cette orientation sur la pile de navigation sans animation. Lorsque vous retournez, vous faites disparaître la dernière vue. L'utilisateur ne peut pas dire qu'ils sont des vues différentes. – TechZen

0

Je suis assez sûr que vous n'avez pas besoin de spécifier le cadre lors de la construction UITableViewCell par défaut. Habituellement, la taille de l'image est gérée par UITableView lui-même. Mais si vous le souhaitez, vous pouvez envoyer un message setNeedsLayout et/ou setNeedsDisplay à tableView pour le forcer à mettre à jour la disposition des cellules (dans un gestionnaire d'orientation).

+0

J'ai essayé les deux. Mais rien n'a changé. J'ai encore besoin de faire défiler quand j'ai changé l'orientation pour remplacer les CGRects du portrait par les CGRects du paysage. J'ai besoin des CGRects pour placer le texte à différents endroits dans une tableview cell par défaut. – Christian

Questions connexes