2010-10-25 15 views
1

Juste au moment où je pensais avoir tout compris ... j'ai eu ce problème.Conflit paysage/portrait - iOS

le scénario.

J'ai une simple tableView. et avec une barre de recherche dans titleView de l'élément de navigation. Le SearchBar est ajouté à navItems titleView via un uibarbuttonitem dans la barre d'outils des contrôleurs de vue.

maintenant, normalement

Après avoir lancé avec la barre de recherche [beginResponder] le clavier apparaît. Et il envoie une notification "KeyboardDidShow" qui est où je calcule la hauteur de l'UIKeyboard et régler la hauteur de tableView en conséquence (le raccourcir).

ON Rotation - aller-retour paysage/portrait, tout fonctionne bien. - (void) didRotateInferfaceOrientation est appelée et everythings kool.

Voici le problème. Lorsque le clavier est actif, il dispose d'un bouton "recherche" Google, ce qui pousse à une nouvelle vue - webviewcontroller.

le problème est, ce

Quand [PORTRAIT] ViewController [SearchBar avec clavier actif] -> robinets Recherche -> [Portrait] WebViewController -> Changer dispositif Orientation [Paysage] -> [Paysage] WebViewController change en paysage ---> HERE LE PROBLEME, l'utilisateur appuie sur uiViewController [Paysage]

La méthode -didRotatefromInterfaceOrientation n'est pas appelée. et d'une façon ou d'une autre, la hauteur de tableView est foiré. Bien que la vue tourne parfaitement.

Y at-il quelque chose qui manque ici im ..

apprécierait tout aide. .thanks

Répondre

0

J'ai eu un problème similaire dans une de mes applications récemment, pas exactement notre problème mais ne vous embêtez pas, vous devriez voir ce que je vais faire: Je voulais simplement faire tourner un viewController affiché en utilisant presentModalViewController ... Malheureusement ça n'a pas vraiment marché, surtout sur un ancien iPhone avec OS avant iOS 4 ... Donc j'ai dû faire une rotation par programme! Juste obtenir votre taille d'écran, utilisez CGAffineTransform ou quelque chose comme ça et changer les tailles et puis vous devriez avoir terminé ... Si votre intérêt je pourrais poster un tas de code, alors faites le moi savoir!

EDIT:

UIScreen *screen = [UIScreen mainScreen]; 
     myController.view.bounds = CGRectMake(0, 0, screen.bounds.size.height, screen.bounds.size.width - 20); 
     if(currentOrientation == UIDeviceOrientationLandscapeRight){ 
      myController.view.transform = CGAffineTransformConcat(myController.view.transform, CGAffineTransformMakeRotation(degreesToRadian(-90))); 

     }else{ 
      myController.view.transform = CGAffineTransformConcat(myController.view.transform, CGAffineTransformMakeRotation(degreesToRadian(90))); 

     } 
     myController.view.center = window.center; 
     [[UIApplication sharedApplication] setStatusBarOrientation:currentOrientation]; 
     [self.window addSubview:self.tabBarController.view]; 
     [self.window bringSubviewToFront:self.tabBarController.view]; 
     [self.window addSubview:myController.view]; 
     [self.window bringSubviewToFront:myController.view]; 
     [self.tabBarController.view removeFromSuperview];` 

Cela inclut également la suppression d'un TabBar lors de la rotation en mode paysage pour obtenir plus d'espace ...enjoy :)

+0

Je serais certainement intéressé si vous pouviez jeter du code là-bas :) – user134611

+0

J'ai édité mon post précédent, alors jetez un coup d'oeil et dites-moi si cela correspond à vos besoins, sinon je peux suggérer autre chose: D –

+0

Cant je vous remercie assez :) – user134611

1

Lorsque l'utilisateur appuie à nouveau, -didRotatefromInterfaceOrientation ne sera pas appelé. Vous devez vérifier l'orientation dans viewWillAppear (ou appeler viewDidLoad, avant de revenir à l'arrière), puis appeler la mise en page appropriée pour l'orientation choisie.

Dans toutes vos méthodes (BOOL) shouldRotate ..., vous devez appeler une méthode distincte pour vous assurer que votre disposition est correcte pour l'orientation de l'appareil.

+0

Vous voulez dire avoir une seule méthode pour l'orientation, puis l'appeler à chaque fois sur ViewDidLoad et viewWillAppear ?? – user134611

+0

Avoir une seule méthode à des fins d'orientation et l'appeler everytime -BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation est appelée. – Jordan

0

Vous pouvez appeler manuellement didRotateFromInterfaceOrientation sur viewWillAppear et simplement passer une orientation vous-même (c'est-à-dire [UIApplication sharedApplication] .statusBarOrientation).