32 votes

La barre d'état apparaît au-dessus des limites de ma vue dans iOS 7

J'ai essayé de tester mon application sous iOS 7, et j'ai remarqué que ma vue apparaît au-dessus de la barre d'état... Comme je l'ai lu, sous iOS 7, la barre d'état est cachée. Alors comment faire pour la rendre compatible avec les versions iOS 6 et iOS 7? Dois-je créer des fichiers .xib différents pour chaque version iOS pour chaque écran?

J'ai lu ceci : Si les deux versions d'une application standard doivent avoir une mise en page similaire, utilisez Auto Layout pour créer une interface utilisateur qui fonctionne correctement dans les deux versions d'iOS. Pour prendre en charge plusieurs versions d'iOS, spécifiez un ensemble unique de contraintes que Auto Layout peut utiliser pour ajuster les vues et les contrôles dans le storyboard ou les fichiers XIB (pour en savoir plus sur les contraintes, consultez "Les contraintes définissent les relations entre les vues").

Si les deux versions d'une application standard doivent avoir une mise en page similaire et que vous n'utilisez pas Auto Layout, utilisez des décalages. Pour utiliser des décalages, mettez d'abord à jour l'interface utilisateur pour iOS 7. Ensuite, spécifiez des valeurs qui définissent l'origine, la hauteur et la largeur de chaque élément dans l'interface utilisateur antérieure en tant que décalages par rapport à la nouvelle position de l'élément dans l'interface utilisateur iOS 7.

Mais lorsque j'utilise l'Auto Layout dans le .xib, une erreur s'affiche indiquant que l'Auto Layout est dans une version antérieure à iOS 6.

Comment puis-je résoudre ce problème?

37voto

Nerrolken Points 823

IOS 7 prend apparemment en charge la barre d'état cachée pour certaines vues mais pas pour d'autres. Pour la cacher pour toutes les vues, faites ce qui suit:

  1. Assurez-vous que Masquer lors du lancement de l'application est toujours coché, pour prendre en charge les versions précédentes du système d'exploitation.
  2. Dans votre fichier Info.plist, ajoutez Apparence de la barre d'état basée sur le contrôleur de vue et définissez-le sur NO.
  3. Vous devrez peut-être "Nettoyer" avant de construire, (je l'ai fait), mais ensuite votre application devrait fonctionner comme avant : aucune barre d'état ne dépasse de vos vues!

24voto

NIKHIL Points 2152

Vous devez probablement ajouter le code suivant sur chaque contrôleur de vue.

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])
    {
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
    else
    {
        // iOS 6
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    }
}

// Ajoutez cette méthode
- (BOOL)prefersStatusBarHidden {
    return YES;
}

9voto

ruslan Points 5754

Je rencontre le même problème. Pour l'instant, j'ai fait deux piratages et je déciderai avec lequel je continuerai :

  • Vous pouvez masquer complètement la barre d'état en définissant UIStatusBarHidden et UIViewControllerBasedStatusBarAppearance à true.
  • Dans mon application, j'ai créé une contrainte de marge supérieure (Top Spacing) avec une valeur 0, et je la change de façon programmatique à 20 si je détecte que l'application est exécutée sur iOS 7.

Comment puis-je faire en sorte qu'Autolayout tienne compte de la zone de la barre d'état ?


Eh bien, j'ai compris.

Dans votre sous-vue (BRSMyListSubViewController dans mon cas), dans viewDidLoad, vous devez définir l'une de ces deux choses

self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;

OU

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;

De façon intéressante, dans le contrôleur de vue racine, ces valeurs sont définies par défaut à UIRectEdgeAll, NO et YES respectivement, mais sa tableView N'EST PAS sous la barre de navigation et le pied de page.

Je ne comprends pas pourquoi c'est si illogique.

Il est aussi étrange que edgesForExtendedLayout doive être associé à l'une des deux autres propriétés même s'il est clairement responsable du comportement.

8voto

Kaz Yoshikawa Points 179

Si vous souhaitez afficher une barre d'état sous iOS 7 avec Xcode 5, il suffit de réorganiser les boutons et autres sous-vues pour faire suffisamment d'espace autour de la barre d'état. Mais, attendez! J'aime aussi supporter iOS 6. Comment faire?

J'ai trouvé la documentation d'Apple, et j'ai trouvé le titre "Support de deux versions d'une application standard" dans le document.

Si vous modifiez un fichier XIB, sélectionnez-le et cliquez sur l'éditeur assistant. Vous pourrez trouver le menu "manuel, automatique..." aux alentours. Ensuite choisissez "aperçu".

Entrez une description de l'image ici

Ensuite, vous trouverez un agencement de vue côte à côte. Ensuite, vous remarquerez qu'il y a un bouton de type pop-up en bas à droite du volet (vue) de droite; il indique "iOS 7 et ultérieur". Vous pouvez choisir "iOS 6.1 et antérieur". Woa! Maintenant, vous pouvez effectuer des ajustements pour iOS 6.1 sans affecter la mise en page d'iOS 7.

Entrez une description de l'image ici

Si vous travaillez sur le storyboard, c'est pratiquement la même chose. Vous choisissez un objet contrôleur de vue, et cliquez sur le mode éditeur assistant, choisissez "aperçu", puis "iOS7 et ultérieur"... Bluh Bluh Bluh.

Je ne suis pas sûr, mais seul l'éditeur assistant est capable de passer en mode iOS 7+/iOS 6-. Je viens de découvrir cela très récemment, donc n'hésitez pas à signaler s'il y a des malentendus ou d'autres astuces.

3voto

DongXu Points 152

Il n'est pas nécessaire de construire plusieurs xib. Je pense que votre problème est le "20px" : le même fichier XIB a l'air super sur iOS 6, mais il manque 20 pixels sur iOS 7.

Par exemple, vous avez une vue, et son Y = 0. Sur iOS 6, elle est près du bas de la barre d'état. Sur iOS 7, elle apparaît au-dessus de la barre d'état.

Vous devriez utiliser Xcode 5 pour ouvrir vos fichiers XIB et activer l'éditeur assistant. Suivez ces étapes :

  1. Sélectionnez l'inspecteur de fichiers et passez "Affichage comme" à "iOS 7 et ultérieur"

  2. Sélectionnez l'inspecteur de taille et remplissez deltaY avec "-20"

  3. C'est fait !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X