2009-09-03 4 views
3

J'ai deux applications, qui obligent l'utilisateur à utiliser l'iPhone en mode paysage, afin d'avoir un écran plus large, au lieu d'un plus grand. L'une des choses que j'ai trouvées est que ma première vue sera bonne, mais toutes les autres vues ont leurs sous-vues (UIButtons, UIPicker, UIViews) pressées d'un côté ou clippées (selon que les éléments ont été réglés) pour déplacer, redimensionner ou rester dans la même position que la taille de la vue changée). Toutes mes vues sont conçues en IB dans l'orientation paysage. Mon UIWindow sous-jacent, et tout ce à quoi je peux penser a été présenté en orientation paysage. Même mon fichier plist a le drapeau UIInterfaceOrientationLandscapeRight. Maintenant, si je charge toutes mes vues en même temps que mon contrôleur rootview, alors je n'ai aucun problème. Mais si j'ai des vues chargées plus tard, elles seront coupées ou pressées.Difficulté avec les applications avec une orientation paysage forcé

La seule façon de contourner le problème est d'ajouter la ligne suivante dans mon code qui se déplie dans une nouvelle vue:

[coming.view setFrame:CGRectMake(0, 0, 480, 300)]; 

Quelqu'un sait pourquoi je dois le faire? Est-il juste que l'iPhone suppose que les vues chargées sont 300x480 à moins qu'une transformation ne leur soit appliquée?

Merci.

ps. C'est ce que la vue ressemble si je n'appelle setFrame, comme décrit ci-dessus:

alt text http://files.me.com/mahboud/ljhvun

Tous les viewcontrollers, qui sont chargées après la première aura leur écran de la même pressé vers le bas. Pour une raison quelconque, le premier viewcontroller n'a pas ce problème.

+0

Je peux confirmer que c'est toujours un problème à partir de iPhone OS 3.1.3. Comme j'ai deux incidents de support gratuits inclus dans mon abonnement ADC, j'en ai déposé un et je vous le ferai savoir quand j'ai des nouvelles. –

Répondre

0

Une bonne réponse dépendra de la façon dont vous allez forcer l'orientation paysage. Si vous faites cela par l'intermédiaire de UIViewController et de la compagnie, cela devrait être relativement simple; pour d'autres méthodes probablement plus complexes.

Dans le cas simple, vous devriez être en mesure de passer outre shouldAutorotateToInterfaceOrientation: sur votre contrôleur de vue, configurer vos vues dans Interface Builder, et définir la clé UIInterfaceOrientation-UIInterfaceOrientationLandscapeRight dans votre Info.plist et définir.

+0

UIInterfaceOrientationLandscapeRight est défini dans l'info.plist afin que l'application arrive dans cette orientation dès le départ. Tout dans les NIB sont configurés dans la même orientation. Toutefois, la taille de la vue doit être définie comme ci-dessus pour les vues suivantes afin qu'elles puissent afficher leur contenu correctement. Je – mahboudz

1

Je pense que vous souhaitez utiliser le mode paysage dans chaque vue de votre application. Et vous voulez que la plume soit aussi en mode paysage. Vous pouvez redimensionner la vue à (0,0480,300 pour la barre d'état, 320 pour la barre d'état non) dans nib. Et conçois ce que tu veux. Enfin, dans le contrôleur de vue, retournez non pour autorotate. Et enfin transformer la vue et faire pivoter.

+0

changé tout mon \t retour ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || \t \t \t \t (interfaceOrientation == UIInterfaceOrientationLandscapeRight)); pour retourner NO à la place pour tous les cas. L'application arrive avec toutes les vues en mode portrait. – mahboudz

+2

Vous ne devriez jamais retourner NO pour 'shouldAutorotate'. Renvoyer NO signifie que vous ne voulez pas être dans une orientation, ce qui est impossible. UIKit enregistrera un avertissement dans la console, vous devriez le vérifier. Au lieu de cela, renvoyez OUI pour les orientations souhaitées. –

1

J'ai eu un problème similaire, j'ai posé la question sur SO, puis j'ai compris et répondu moi-même. Tu voudras peut-être vérifier.

+0

La solution de Clay a bien fonctionné pour moi. –

0

Une façon simple je fixe c'était d'avoir ma sous-classe contrôleur vue racine UINavigationController, et mettre en œuvre shouldAutorotateToInterfaceOrientation pour gérer en mode paysage par exemple,

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

Chaque contrôleur de vue qui est poussé vers le contrôleur de navigation semble apparaître dans paysage aussi.

Questions connexes