2010-04-20 4 views
6

The documentation dit que si je veux soutenir à la fois portrait et paysage, j'ai essentiellement deux façons de le faire:Comment charger différents XIB pour différentes orientations de périphérique pour le même contrôleur de vue?

  1. Mettre en place le point de vue de la viewcontroller pour que les sous-vues AutoResize correctement et faire des petits changements par programmation à l'exécution
  2. Si les changements sont plus importants, create an alternative landscape interface et push/pop le viewcontroller modal alternatif à l'exécution

Je voudrais présenter l'information où la mise en page est sensiblement différente, mais la logique est la même. Idéalement, je voudrais charger un autre XIB pour le même viewcontroller, mais cela ne semble pas être une option.

Des sons comme le n ° 2 sont ce que j'ai besoin de faire, mais mon problème avec ça, c'est qu'il semblerait que cela utiliserait les animations modalviewcontroller standard qui ne sont rien comme l'animation de rotation du périphérique. (Bien sûr, étant la lazywebber que je suis, je n'ai pas testé cette hypothèse.)

Alors, comment charger une mise en page alternative pour le paysage avec le même viewcontroller mais XIB différent? Dois-je utiliser la méthode n ° 2 ci-dessus et l'animation de rotation est-elle naturelle? Ou y a-t-il un autre moyen?

Répondre

1

J'instancier mes UIView cas dans -viewDidLoad: et les ajouter comme subviews à la propriété du contrôleur de vue view:

- (void) viewDidLoad { 
    [super viewDidLoad]; 

    self.myView = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 280.0f, 210.0f)] autorelease]; 
    // ... 
    [self.view addSubview:myView]; 
} 

Je puis appeler -viewWillAppear: au centre de ces sous-vues:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]]; 
} 

Je surchargeons aussi -willRotateToInterfaceOrientation:duration:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self adjustViewsForOrientation:newInterfaceOrientation]; 
} 

Le procédé -adjustViewsForOrientation: définit le centre CGPoint de divers objets de sous-vue, en fonction de l'orientation de l'appareil:

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation { 
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
     myView.center = CGPointMake(235.0f, 42.0f); 
     // ... 
    } 
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { 
     myView.center = CGPointMake(160.0f, 52.0f); 
     // ... 
    } 
} 

Lorsque le contrôleur d'affichage est chargé, les UIView instances sont créées et positionnées basées sur l'orientation actuelle de l'appareil. Si le périphérique est ensuite pivoté, les vues sont recentrées sur de nouvelles coordonnées.

Pour rendre ceci plus fluide, on pourrait probablement utiliser une animation à clé dans -adjustViewsForOrientation:, de sorte que les sous-vues se déplacent plus gracieusement d'un centre à l'autre. Mais ce qui précède fonctionne pour moi, pour l'instant.

Questions connexes