web-dev-qa-db-fra.com

Pourquoi sous iOS 8 mon application au lancement adopte une mauvaise orientation?

mon application jusqu'à iOS 7 fonctionne correctement. Je l'ai essayé aujourd'hui avec Xcode 6 et quand je le lance, j'ai une mauvaise surprise :(:

enter image description here Vous pouvez voir que Xcode dessine maintenant mon viewController comme s'il était en mode portrait mais, comme vous pouvez le voir, en mode paysage. 

Savez-vous ce qui change dans iOS 8? :/ J'ai utilisé les méthodes d'orientation suivantes:

  • (NSUInteger) supportedInterfaceOrientations
  • (BOOL) devraitAutorotate
  • (BOOL) devraitAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation

MODIFIER: 

Je viens de découvrir cette méthode:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{
 return UIInterfaceOrientationMaskLandscape;
}

Et maintenant, mes premiers viewcontrollers fonctionnent correctement :). le problème est quand je montre un modal (qui change l'ensemble de la méthode dans UIInterfaceOrientationMaskAll) refaire l'effet laid de screenshot Justement, je change mes méthodes dans ce mode:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if(self.restrictRotation)
    {
        return UIInterfaceOrientationMaskLandscape;
    }    
    else
    {
        return UIInterfaceOrientationMaskAll;
    }
}


// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
    NSLog(@"updateInterfaceAfterDocumentPreviewViewController");

    [[UIApplication sharedApplication]     setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];

    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = YES;
}
23
user3914418

S'il vous plaît essayez le code suivant

Dans la didFinishLaunchingWithOptions de AppDelegate

self.window.rootViewController = self.viewController;

[self.window makeKeyAndVisible];

[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
16
chonbo

Le problème semble être l’ordre des appels lorsque vous configurez la fenêtre. Vous devez appeler makeKeyAndVisible avant d'affecter rootViewController dans votre méthode didFinishLaunchingWithOptions sur le délégué d'application. Les oeuvres suivantes:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;

Mais si vous modifiez l'ordre en:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];

Vous obtenez le comportement que vous rencontrez.

8
Dave Kammeyer

Consultez votre fichier .plist. 

  1. Assurez-vous que "Orientation initiale de l'interface" est défini comme orientation souhaitée.
  2. Dans les "Orientations d'interface prises en charge", indiquez l'orientation privilégiée comme première entrée de la liste (on dirait que Apple a modifié cet ordre). 
1
benaneesh

J'ai eu exactement le même problème avec un "écran de chargement". C'est ce qui a fonctionné pour moi. (Remarque: mon application ne prend en charge que iOS 7 ou version ultérieure, en mode paysage.):

    CGRect theFrame = self.view.frame;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
        CGRect screenBounds = [[UIScreen mainScreen] bounds];
        theFrame.Origin = CGPointZero;
        theFrame.size.width = screenBounds.size.height;
        theFrame.size.height = screenBounds.size.width;
    }

    NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
    self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];

Veuillez vous reporter à la réponse de Mike Hay si votre application prend en charge l'orientation portrait et pour connaître le "chemin à parcourir pour calculer le cadre d'application correct": https://stackoverflow.com/a/18072095/4108485

J'espère que cela t'aides.

1
l3bel

J'avais un problème similaire, je ne pouvais pas montrer le bon lancer d'images à afficher (j'avais deux pour iPad, Default-Portrait.png et Default-Landscape.png) et je ne pouvais pas non plus que l'application elle-même s'oriente après que l'image de lancement a disparu.

Pour résoudre le problème des images de lancement:

  • Accédez à la section Propriétés de la cible iOS personnalisée du projet (cliquez sur l'icône de votre projet en haut de la liste des fichiers du projet. Cette section devrait être la première section affichée).
  • Ajoutez une ligne à cette table appelée "image de lancement" (doit remplir automatiquement) et entrez "par défaut" comme chaîne dans la colonne de droite.
  • Assurez-vous que vos images de lancement respectent les consignes de nom de fichier d’Apple (par exemple: Par défaut-568 @ 2x, Par défaut @ 2x, etc.)}/ cochez cette réponse SO

Pour résoudre le problème d'orientation des applications dans un premier temps ViewController:

  • Accédez au fichier de votre liste de projets (devrait être "YourApp-Info.plist")
  • Ajoutez une ligne et entrez "Orientations d'interface prises en charge"
  • Ajoutez les orientations prises en charge par votre application 
1
scarfox

Solution Oldschool:

BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
    CGFloat height = CGRectGetHeight(self.view.frame);
    CGFloat width = CGRectGetWidth(self.view.frame);
    if (width / height > 1.0) {
        portrait = NO;
    } else {
        portrait = YES;
    }
} else {
    portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
    [self layoutPortrait];
} else {
    [self layoutLandscape];
}

Vous pouvez appeler cela dans viewWillLayoutSubviews

0
Avi Cohen

Cette approche de la détection de l'orientation était obsolète dans iOS8 (mais était toujours autorisée pour le moment). Il a été remplacé par le concept de classes de taille et Collections de caractères

(Bizarrement, je n'arrive pas à trouver une référence de classe de taille dans la documentation d'Apple en ligne pour le moment - jurerais qu'elle l'était auparavant - peut-être en XCode). Voir ici pour les vidéos WWDC.

Quoi qu'il en soit, Interface Builder contient une case à cocher indiquant " Utiliser les classes de taille ." Peut-être avez-vous coché cette case. Éteignez-le et voyez si cela vous aide?

0
mc01
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;

if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
    {
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

        // -- Fix for rotation issue for ios 8
        if( IS_IOS_8_OR_LATER )
        {
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
                                                                 bundle: nil];
            // -- Set frame of nav controller
            UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];

            self.window.rootViewController = nc;

            [self.window setFrame:[[UIScreen mainScreen] bounds]];

            // -- Set fame of home view controller
            UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];

            self.window.rootViewController = vc;

            [self.window makeKeyAndVisible];

            [self.window setFrame:[[UIScreen mainScreen] bounds]];
        }
    }
}
0
Joshua Haws