2009-12-11 6 views
8

Je développe une application pour iPhone qui a plusieurs plumes et qui ne devrait être que paysage.Application iPhone pour iPhone avec plusieurs plumes

L'application est configuré pour démarrer en mode paysage via son fichier Info.plist. J'ai deux contrôleurs de vue: FirstViewController et SecondViewController.

Pour chacun d'eux, je dispose d'un fichier nib, où la vue est dans le paysage. Les deux contrôleurs de vue sont ajoutés à ma plume MainView comme points de vente, et leurs vues sont initialisées paresseusement.

Lorsque les charges d'application, la première vue apparaît dans le paysage, comme prévu. Cependant, lorsque je passe à la deuxième vue, l'appareil (ou le simulateur) reste en mode paysage, mais la vue est tournée, comme si l'appareil était en mode portrait, ce qui freine mon interface.

Dans les deux UIViewController classes que j'ai le code suivant:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight; 
} 

et pour changer de vue, dans mon délégué app que je fais:

[viewController.view removeFromSuperview]; 
[window addSubview:secondViewController.view]; 

viewController et secondViewController sont les deux points de vente où les contrôleurs de vue sont connectés.

Voici comment la deuxième vue regarde dans IB: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

ce qui est la façon dont il regarde dans le simulateur: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

Pourquoi est-ce la deuxième vue DIFFUSE dans le paysage, mais avec l'interface tourné?

Je ne voudrais pas faire face à des propriétés de transformation, puisque cela semble exagéré.

Répondre

3

cette question, j'espère favoris quelqu'un vous donner une réponse perspicace et je voudrais apprendre quelque chose .. malheureusement, je crains que vous pourriez avoir besoin d'utiliser des transformations pour obtenir que cela fonctionne correctement. Voici le code que je l'ai utilisé ces derniers temps pour résoudre le problème:

- (void)forceLandscapeForView:(UIView *)theView { 
    theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
    theView.bounds = CGRectMake(0, 0, 480, 320); 
    theView.center = CGPointMake(160, 240); 
    [theView setNeedsLayout]; 
    [theView setNeedsDisplay]; 
} 

Puis, quand vous ajoutez votre nouvelle vue, vérifiez l'orientation actuelle et si la force nécessaire la rotation:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) { 
    [self forceLandscapeForView:_activeViewController.view]; 
} 

Ensuite, Bien sûr, vous aurez envie de répondre adéquatement à shouldAutorotateToInterfaceOrientation dans chacun de vos contrôleurs de vue:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
} 

J'aimerais entendre parler de solutions de rechange si ce n'est pas tous néces sary.Il y a aussi une mise en garde que j'ai remarquée avec cette configuration: si vous avez une transition entre les vues, et que vous faites pivoter le téléphone pendant cette transition, il est possible que les orientations des vues soient retournées ou "bloquées" sur une orientation paysage incorrecte, comme que vous devez retourner le téléphone (paysage-droit vs paysage-gauche) lorsque vous naviguez entre les vues.

+0

Jusqu'ici, cela s'est avéré être l'approche la plus fiable pour accomplir ce que je veux. – pgb

+0

Ceci (la première méthode) a fonctionné pour moi. J'étais à la recherche d'une solution pendant des heures et j'ai essayé quelque chose de similaire plus tôt (mais dans les vues didload ...). Appliquez la transformation ci-dessus avant de l'ajouter en tant que sous-vue. – Wollan

0

il est juste une suggestion, mais vous pouvez essayer de revenir NO dans la méthode shouldAotorotate pour la deuxième vue. Ou essayez de le faire dans la vue de portrait dans l'IB. Il semble que votre vue a été chargée correctement (en mode paysage), mais a ensuite reçu le message shouldAutorotate et a été pivoté de 90 degrés.

+0

Je l'ai déjà essayé et ça n'a pas marché. – pgb