2010-09-27 5 views
0

Je travaille sur une application iPhone/iPad universelle. J'utilise MonoTouch, mais je peux prendre des réponses en Obj-C (je devrais être capable de le déchiffrer, et UIKit de MonoTouch est de 1 à 1 pour la plupart).iPhone/iPad - commutation Les vues causent des problèmes d'orientation

Fondamentalement, mon application dispose de 2 vues: une vue de «connexion» et une vue «connecté». Au démarrage de l'application, mon affichage de connexion est la seule sous-vue de mon UIWindow principal. Après la connexion, j'appelle RemoveFromSuperview sur la vue de connexion et UIWindow.AddSubView pour ajouter la vue connectée. Tout cela fonctionne très bien, et les orientations fonctionnent aussi b/c je réponds à ShouldAutorotateToInterfaceOrientation. Tout jusqu'à ce que vous vous déconnectiez, et que l'orientation commence à être complètement relevée. Sur l'orientation, l'application oriente la barre d'état, mais laisse mes vues intactes. En plus de cela, sur l'iPad mon UISplitView agit très étrange avec ma vue de maître orientée dans un sens et la vue de détail dans l'autre sens.

Quelle est la bonne façon de changer de vue dans une UIWindow? J'ai l'impression que les orientations devraient fonctionner automatiquement, donc je fais quelque chose de mal.

MISE À JOUR:

Voici un extrait de code (en C#, mais vous voyez l'idée):

_loginController.View.RemoveFromSuperView(); 
_window.AddSubView(_loggedInController.View); 

Pour faire l'inverse:

_loggedInController.View.RemoveFromSuperView(); 
_window.AddSubView(_loginController.View); 

Assez simple, non?

MISE À JOUR 2:

J'ai fait simple repro - même inclus un UISplitViewController, et cela fonctionne très bien.

Il doit y avoir quelque chose de spécifique dans mon application qui provoque ce comportement étrange. Si je comprends bien, vous pouvez vérifier l'orientation de la vue avant de charger la nouvelle vue.

Répondre

0

Dans mon nouveau projet, le problème a commencé à apparaître de façon aléatoire (je ne sais pas exactement ce que j'ai changé pour que cela se produise). Donc, il doit y avoir quelque chose dans ma disposition de l'interface utilisateur le provoquant.

J'ai pris une suggestion d'un commentateur, et jeté un coup d'oeil aux vues modales.

Les travaux suivants grands:

  • Fait la SplitViewController la vue de haut niveau
  • Fait login vue rapide apparaissent de façon modale du SVC
  • fonctionnalité Déconnexion est: _loggedInController.PresentModalViewController (_loginController, true) ;
  • La fonctionnalité de connexion est la suivante: _loggedInController.DismissModalViewControllerAnimated (true);
  • Le code d'orientation pour fixer le cadre de SVC doit encore être ajouté à viewDidLoad

Aucun problème d'orientation étranges se produisent maintenant.

Cela donne également l'avantage d'une transition en douceur sans ajouter de code pour le faire.

0

Je pense que j'ai fait quelque chose de presque identique. Essayez de faire quelque chose comme ceci:

CGRect frame = [[UIScreen mainScreen] applicationFrame]; 

    switch(splitViewController.interfaceOrientation){ 
     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationPortraitUpsideDown: 
      [splitViewController.view setFrame:frame]; 
      break; 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      [splitViewController.view setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.height, frame.size.width)]; 
      break; 
    } 

Fondamentalement obtenir le cadre d'application en cours et l'orienter manuellement. Il y a un bug dans le splitViewController qui ne vérifie pas l'orientation si vous l'affichez après l'exécution de la méthode applicationDidFinishLaunching.

+0

Mon vue de connexion n'a pas de vue partagée, alors pourquoi ce problème se poserait-il? C'est une vue assez standard avec nom d'utilisateur/mot de passe et un bouton. De toute façon, je vais donner un coup de feu. – jonathanpeppers

+0

Cela a causé des problèmes étranges similaires, je faisais déjà ce travail d'orientation dans mon UISplitViewController sur ViewDidAppear. Je vais essayer de reproduire cela avec une application de test, et le poster ici. – jonathanpeppers

+0

Vérifiez mon autre réponse, cela peut aider plus ... – gabaum10

0

Ok, je vois, eh bien j'ai une application similaire, mais j'ai juste abordé le problème différemment.

J'ai créé et initialisé le splitViewController dans la méthode appDidFinishLaunching et l'ai transmis à mon écran de connexion.

theLoginScreen = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]]; 
    theLoginScreen.splitViewController = splitViewController; 
    theLoginScreen.detailViewController = detailViewController; 
    theLoginScreen.rootViewController = rootViewController; 
    theLoginScreen.appDelegate = self; 

    [window addSubview:theLoginScreen.view]; 

De là, je faisais les choses de connexion, puis fait quelque chose comme ceci:

[self.view removeFromSuperview]; 

    CGRect frame = [[UIScreen mainScreen] applicationFrame]; 

    switch(splitViewController.interfaceOrientation){ 
     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationPortraitUpsideDown: 
      [splitViewController.view setFrame:frame]; 
      break; 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      [splitViewController.view setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.height, frame.size.width)]; 
      break; 
    } 

    [appDelegate.window addSubview:splitViewController.view]; 

donner quelque chose comme un coup de feu et voir si cela fonctionne. :)

+0

N'agit pas différemment que l'autre réponse. Encore une fois, je vais faire le projet le plus simple de répliquer le problème, car je pense que le UISplitViewController peut être à l'origine du problème. – jonathanpeppers

+1

Ok, un couple de choses. Votre splitview chargement étrangement (RV droite, DV faux) devrait être corrigé par le code ci-dessus. J'ai eu le même problème, et cela l'a réparé. Deuxièmement, avez-vous déjà affiché quelque chose de façon modale? Je le faisais avant et cela causait le genre de rotation de la barre d'état/vue problème bloqué que vous décrivez. – gabaum10

+0

Cela avait quelque chose à voir avec la façon dont j'affichais la vue modale. La vue n'était pas en rotation, donc la vue modale était bloqué aussi. – gabaum10

Questions connexes