Question

J'ai UITableViewCell personnalisée qui contient plusieurs UIButtons. la position de trame de chaque bouton est relatif à la largeur de la cellule. Je mets autoresizingMask = UIViewAutoresizingFlexibleWidth il ajustera la largeur de la cellule et les positions de bouton correctement lorsque l'application commence par l'appareil soit en mode paysage ou portrait.

La question est quand le dispositif est mis en rotation d'un mode à l'autre, les boutons ne règlent pas les positions parce que la UITableViewCell est réutilisable. En d'autres termes, la cellule n'est pas initialisés en fonction de la nouvelle largeur de UITalbeView parce que initWithStyle fonction de la cellule est appelée avant que le dispositif est mis en rotation et n'est pas appelé à nouveau après la rotation de l'appareil. Toutes les suggestions?

Était-ce utile?

La solution 2

Après avoir passé des heures de recherche (y compris les postes dans ce site), je ne pouvais pas trouver des solutions. Mais une ampoule allume tout d'un coup. La solution est très simple. Il suffit de détecter si l'orientation de l'appareil est en mode paysage ou portrait et définir le ReusableCellIdentifier avec un nom différent pour chacun.

static NSString*Identifier;

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                Identifier= @"aCell_portrait";
            }
            else Identifier= @"DocumentOptionIdentifier_Landscape";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Autres conseils

Depuis UITableViewCell est aussi un UIView, vous pouvez remplacer la méthode setFrame. Chaque fois que votre point de vue de la table tourne, cette méthode sera appelée pour toutes les cellules.

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    //Do your rotation stuffs here :)
} 

Réponse précédente a un sérieux problème. Vous devez utiliser [UIApplication sharedApplication] .statusBarOrientation au lieu de .orientation [UIDevice currebtDevice] parce que l'orientation de l'appareil n'a rien à voir avec l'orientation de l'interface -. Orientation de l'appareil est rotation physique basée sur l'accéléromètre

La réponse fait tic tac fonctionne comme un charme dans les anciennes versions iOS. Pour iOS 6.0 je le code suivant:

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Vous aurez besoin de fixer vos cellules largeur du cadre (en supposant que la hauteur est même en mode portrait et en mode paysage) dans votre méthode de cellForRowAtIndexPath. C'est ce qui fonctionne ici. Je l'habitude de créer un TableViewCell personnalisé avec IB et il est toujours initialisés pour le portrait 320 Largeur px. Avec la définition du cadre fonctionne comme prévu, même si la cellule est « réutilisé » de la file d'attente.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) {
    // create cell here...
 }

 // Adjust cell frame width to be equal to tableview frame width
 cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height);
 ...
}

J'ai eu un problème similaire et ce poste m'a aidé. Dans mon cas, j'ai une classe personnalisée déclarée dans un fichier séparé, et dans ce fichier je le code suivant dans layoutSubviews:

//PORTRAIT CELL
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight)
{
    //build the custom content views for portrait mode here
}
else
{
    //build the custom content views for landscape mode here
}

Ensuite, dans mon contrôleur de vue je mettre simplement willAnimateRotationToInterfaceOrientation: et envoyer le message reloadData à mon avis de la table.

Avec cela, je n'ai pas toucher la méthode cellForRow.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top