UIScreen applicationFrame retour rectangle incorrect sur le lancement de l'application du paysage (iPhone / iPad)

StackOverflow https://stackoverflow.com/questions/2664980

Question

Avoir du mal à les limites correctes pour mon application iPad lors du lancement en mode paysage. J'ai les clés appropriées définies dans mon fichier Info.plist, et mes contrôleurs de vue lance correctement dans le paysage (et portrait, natch).

Dans ma méthode de applicationDidFinishLaunching: j'appelle un sélecteur après un délai de 3 secondes, et cette méthode fait appel à [[UIScreen mainScreen] applicationFrame], mais il me retourner un cadre portrait (c.-à-hauteur> largeur).

Quelqu'un sait comment résoudre ce problème? Ça sent comme un bug me (si je vais déposer un radar), mais si elle est destinée comportement, où est-il documenté?

Était-ce utile?

La solution

Lorsque vous tenez l'iPad en orientation paysage et lancer une application, le contrôleur de vue voit d'abord des limites pour une vue portrait (même si les rapports d'orientation du paysage). Le contrôleur de vue alors obtenir un message à tourner à l'orientation du paysage avant qu'il apparaisse.

Autres conseils

Je ne compte jamais sur [[UIScreen mainScreen] applicationFrame], en particulier lors du lancement de l'application.

Lors de la création de vues dans le code, utilisez le superview pour définir votre cadre.

Si vous utilisez xibs avec « éléments d'interface simulés » ils seront correctement dimensionné et tout fonctionne très bien.

applications basées sur UINavigationController

Dans le cas d'une application à base de UINavigationController, prenez le cadre directement à partir self.navigationController.view, ne pas essayer d'utiliser [self loadView] et self.view.superview. UINavigationController utilise « caché » pour faire le travail subviews de - donc la superview directe ne fonctionnera pas

.

UINavigationController est spécial parce que pendant l'application lancement, le contrôleur de navigation redimensionne votre point de vue après loadView est appelé. Quand un redimensionnement automatique entre en jeu vous vous retrouvez avec une petite marge au bas de l'écran.

Pourquoi ne pas UIScreen

[[UIScreen mainScreen] applicationFrame] ne fonctionne pas correctement (en particulier lors du lancement de l'application dans le paysage). Mon expérience est que la propriété interfaceOrientation du viewcontroller ne correspond pas à l'orientation applicationFrame.

CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}

Ceci est la façon dont je reçois le CGRect correct lorsque le contrôleur de vue est sur le paysage:

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);

est ainsi conçu. Vous devez interroger la taille de votre superview et ajustez si nécessaire.

[[UIScreen mainScreen] applicationFrame] retourne toujours le rectangle portrait, même si l'application est en mode paysage. Ceci est lié au fait que UIWindow jamais en fait tourne, mais juste change la transformation de la place rootViewController.view.

Pour vous assurer, vous pouvez imprimer l'objet de vue racine en mode portrait et paysage, et vous verrez quelque chose comme ceci:

Portrait:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

Paysage:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...

Alors, ajoutez une image de lancement et de lui donner le suffixe -568h, selon les guides d'Apple.

Je ne comprends pas pourquoi tout le monde avec un esprit sonore serait un paramètre système dépendent d'un graphique; mais je viens de tester et cela a fonctionné.

Voici l'endroit qui m'a appris après une recherche rapide je ne vois pas cette réponse ci-dessus, pensé qu'il serait utile à quelqu'un.

S

Je suis entré dans même problème lorsque la vue rejetant avec dismissViewControllerAnimated dans le plugin Cordova. J'ai modifié le code pour la méthode singingAtom viewWillAppear dans MainViewController, qui a obtenu redimensionnée après avoir rejeté vue modal:

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top