2010-09-25 5 views
2

Mon application universelle est une vue unique en mode plein écran. En appuyant sur un bouton flips pour révéler une page de paramètres:iOS: AutoRotation entre NIBs

- (void) showSettings 
{ 
FlipsideViewController * flipsideVC = [FlipsideViewController alloc]; 

NSString * settingsNib; 
if (isIPad()) 
    settingsNib = isCurrentlyPortrait() ? @"settings_iPad_portrait" : @"settings_iPad_landscape"; 
else 
    settingsNib = @"settings_iPhone"; 

[flipsideVC initWithNibName: settingsNib 
        bundle: nil ]; 

flipsideVC.delegatePointingToMainVC = self; 

flipsideVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 

[self presentModalViewController: flipsideVC 
         animated: YES ]; 

[flipsideVC release]; 
} 

et la page des paramètres appelle la méthode déléguée: Je Recréez la vue principale à la lumière des paramètres modifiés, et retourner en arrière.

- (void) settingsDidQuit:(FlipsideViewController *) flipsideVC 
{ 
[self createOrRecreateWheelView]; 
[self dismissModalViewControllerAnimated: YES]; 
} 

Mais que se passe-t-il si l'utilisateur fait pivoter l'iPad sur la page des paramètres? Apple décrète que mon application doit gérer cela. Mais comment faire cela? puis-je charger dynamiquement un nouveau XIB pour la page des paramètres?

Je ne vois pas une façon de le faire, donc ma tentative de solution est d'attraper la rotation dans l'écran des paramètres, ...

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) oldInterfaceOrientation 
{ 
[self.delegatePointingToMainVC settingsOrientationChanged]; 
} 

... et rappeler au contrôleur principal de vue , qui dissout le contrôleur de vue des paramètres et le recrée à la lumière de l'orientation actuelle.

- (void) settingsOrientationChanged 
{ 
[self dismissModalViewControllerAnimated: YES]; 
[self showSettings]; 
} 

Il y a un problème trivial tout de suite - didRotateFromInterfaceOrientation se déclenche automatiquement lorsque les paramètres page se charge. Je peux empêcher cela en définissant une valeur booléenne false dans init, et modifiant ainsi: problème

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) oldInterfaceOrientation 
{ 
if (initialized) 
    [self.delegatePointingToMainVC settingsOrientationChanged]; 

initialized = true; 
} 

avec cette approche est que je navigue sur la page des paramètres, faites pivoter l'appareil, et il montre momentanément la page des paramètres corrects, avant de revenir à ma vue principale.

Je pense qu'il y a un problème de threading ici. Mais peut-être que toute mon approche est fausse. Quelqu'un peut-il suggérer une meilleure solution?

+0

http://stackoverflow.com/questions/2496554/easiest-way-to-support-multiple-orientations-how-do-i-load-a-custom-nib-when-the –

Répondre

2

Je ne suis pas sûr de comprendre le problème. Vous voulez que l'affichage des paramètres (chargé à partir de NIB) pour autorotate? Vous devriez juste retourner YES pour l'orientation que vous voulez que l'autorotation soit effectuée dans le shouldAutorotateToInterfaceOrientation: et définissez le masque d'autoresizing des vues à l'intérieur de la XIB en fonction de vos besoins.

Il n'est pas nécessaire de rappeler le contrôleur de la vue principale et lui demander de pousser un nouveau contrôleur de vue des paramètres. Le comportement de rotation des vues est déterminé par les propriétés du masque autoresizing de chaque vue et par l'implémentation de la méthode shouldAutorotateToInterfaceOrientation: du contrôleur de vues associé et juste cela. Si vous voulez faire des animations plus avancées, cependant, vous pouvez les configurer et les gérer dans les méthodes willRotateToInterfaceOrientation: duration: et didRotateFromInterfaceOrientation:.

+0

Merci - cela fonctionne parfaitement adapté à ma situation, car mon design actuel ne change pas lorsque je tourne l'appareil - seulement les proportions et l'espacement. –

Questions connexes