2010-11-19 22 views
9

Je voudrais gérer le changement d'orientation sur une application iPad avec un UIViewController et deux XIB, disons MenuView et MenuViewLandscape. Donc, dans la méthode willRotateToInterfaceOrientation de MenuViewController, comment puis-je changer XIB sans utiliser un autre contrôleur pour le mode paysage?Changement de l'orientation de la poignée sur l'iPad avec un contrôleur UIView et deux XIB

J'utilise le code suivant:

if(toInterfaceOrientation != UIInterfaceOrientationPortrait){ 
    MenuViewController *landscape = [[MenuViewController alloc] 
             initWithNibName: @"MenuViewLandscape" 
             bundle:nil 
            ];   
    [self setView:landscape.view]; 
} 
else { 
    MenuViewController *potrait = [[MenuViewController alloc] 
            initWithNibName: @"MenuView" 
            bundle:nil 
            ];   
    [self setView:potrait.view]; 
} 

Mais quand je vais voir le paysage des contrôles XIB vue du paysage ne sont pas correctement mis en rotation.

+0

Toute chance avec cela? – RefuX

+0

voir la réponse ci-dessous –

Répondre

12

Je ne suis pas sûr qu'il ya des effets secondaires étranges avec cette mise en œuvre, mais essayer quelque chose comme ça et voir si cela fonctionne pour vous:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration { 
    if (UIInterfaceOrientationIsPortrait(orientation)) { 
     [[NSBundle mainBundle] loadNibNamed:@"MenuView" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI); 
     } 
    } else if (UIInterfaceOrientationIsLandscape(orientation)){ 
     [[NSBundle mainBundle] loadNibNamed:@"MenuViewLandscape" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationLandscapeLeft) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); 
     } else { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI_2); 
     } 
    } 
} 

Cela suppose que le propriétaire du fichier dans votre MenuView et Les XIB MenuViewLandscape sont tous les deux définis sur MenuViewController et la prise de vue est également définie dans les deux XIB. Toutes vos prises doivent être reconnectées correctement lors de la rotation lorsque vous utilisez loadNibNamed.

Si vous construisez pour iOS 4, vous pouvez aussi remplacer les loadNibNamed lignes avec celles-ci:

UINib *nib = [UINib nibWithNibName:@"MenuView" bundle:nil]; 
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = portraitView; 

et

UINib *nib = [UINib nibWithNibName:@"MenuViewLandscape" bundle:nil]; 
UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = landscapeView; 

Ces supposer que le UIView que vous souhaitez afficher suit immédiatement la Les objets proxy du propriétaire du fichier et du premier répondeur dans les XIB.

Ensuite, vous avez juste besoin de vous assurer que les vues sont tournées correctement pour l'orientation de l'interface. Pour toutes les vues qui ne sont pas dans l'orientation portrait par défaut, faites-les pivoter en définissant la propriété transform de la vue et en utilisant CGAffineTransformMakeRotation() avec les valeurs appropriées comme indiqué dans l'exemple ci-dessus. La rotation seule peut résoudre votre problème sans le chargement supplémentaire des NIB. Toutefois, le chargement d'une nouvelle instance entière d'un MenuViewController et la définition de sa vue à l'affichage existant de MenuViewController peuvent provoquer un comportement étrange avec les événements de cycle de vie et de rotation, vous pouvez donc être plus sûr en essayant les exemples ci-dessus. Ils vous évitent également de devoir créer de nouvelles instances MenuViewController lorsque vous en avez seulement besoin.

Espérons que cela aide!

Justin

+0

Salut Justin.J'ai essayé votre solution et cela fonctionne bien pour Portrait. Pour Landscape cependant tout est flou. Tourné correctement, mais avec du texte flou et des étiquettes, tout est plutôt flou. Certaines lignes sont dentelées. Des idées ? Je vous remercie. – TrekOnTV2017

1

Peut-être la réponse de Jon Rodriguez ici fera ce que vous voulez:

Want to use muliple nibs for different iphone interface orientations

Si vous avez deux classes de UIViewController, une classe de base pour le mode portrait et une sous-classe de ce pour mode paysage, vous pouvez mettre presque tout le code dans la classe de base. Cela vous donne donc la plupart des avantages d'une classe de contrôleur de vue unique, tout en vous permettant d'utiliser d'autres solutions comme celle-ci:

Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape?