web-dev-qa-db-fra.com

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, puis ma vue apparaît par-dessus la barre d'état ... Au fur et à mesure de ma lecture, dans iOS 7, la barre d'état est masquée. Alors, comment puis-je le rendre compatible pour fonctionner à la fois dans iOS 6 et iOS 7? Devrais-je créer différents fichiers .xib pour différentes versions d'iOS pour chaque écran?

J'ai lu ce qui suit: Si les deux versions d'une application standard doivent avoir une présentation similaire, utilisez la disposition automatique 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 seul ensemble de contraintes que Auto Layout peut utiliser pour ajuster les vues et les contrôles du storyboard ou des fichiers XIB (pour en savoir plus sur les contraintes, voir «Contraintes: relations express entre vues»).

Si les deux versions d’une application standard doivent avoir une présentation similaire et que vous n’utilisez pas la disposition automatique, utilisez des décalages. Pour utiliser les décalages, commencez par mettre à jour l'interface utilisateur pour iOS 7. Ensuite, indiquez les valeurs qui définissent l'origine, la hauteur et la largeur de chaque élément de l'interface utilisateur précédente en tant que décalages par rapport à la nouvelle position de l'élément dans l'interface utilisateur iOS 7.

Mais lorsque j'utilise autolayout dans .xib, cela indique une erreur: autolayout est dans une version antérieure à iOS 6.

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

32
Bhrigesh

iOS 7 prend apparemment en charge le masquage de la barre d'état pour certaines vues mais pas pour d'autres. Pour le masquer pour toutes les vues, procédez comme suit:

  1. Assurez-vous que Hide during application launch est toujours coché pour prendre en charge les versions précédentes du système d'exploitation.
  2. Dans votre fichier Info.plist, ajoutez View controller-based status bar appearance et définissez-le sur NO
  3. Vous aurez peut-être besoin de "nettoyer" avant de construire (je l'ai fait), mais votre application devrait alors fonctionner comme avant: aucune barre d'état ne pend au-dessus de vos vues!
37
Nerrolken

Vous devrez 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];
    }
}

// Add this method
- (BOOL)prefersStatusBarHidden {
    return YES;
}
24
NIKHIL

J'ai le même problème. Pour l'instant j'ai fait deux hacks et déciderai avec lequel je vais aller:

  • Vous pouvez masquer complètement la barre d'état en définissant UIStatusBarHidden et UIViewControllerBasedStatusBarAppearance sur true.
  • Dans mon application, j'ai créé une contrainte Top Spacing avec la valeur 0 et je la modifie par programmation en 20 si je détecte que l'application est en cours d'exécution sur iOS 7.

Comment créer un compte Autolayout pour la barre d'état?


Eh bien, je l'ai compris.

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

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

OR

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

Il est intéressant de noter que dans le contrôleur de vue racine, ces valeurs sont définies par défaut sur UIRectEdgeAll, NO et YES respectivement, mais sa tableView ne se trouve PAS sous la barre de navigation et le pied de page.

Je ne sais pas pourquoi c'est si illogique.

Il est également étrange que edgesForExtendedLayout doive être mélangé avec l'une des deux autres propriétés, même s'il est clairement responsable du comportement.

9
expert

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

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

Si vous éditez un fichier XIB , sélectionnez-le et cliquez sur assistant éditeur. Vous pourrez y trouver le menu "manuel, automatique ...". Ensuite, choisissez "Aperçu".

Enter image description here

Ensuite, vous trouverez une disposition de vue côte à côte. Ensuite, vous remarquerez qu’un bouton contextuel apparaît dans le coin inférieur droit du volet de droite (vue); il dit "iOS 7 et plus tard". Vous pouvez choisir "iOS 6.1 et versions antérieures". Woa! Vous pouvez maintenant effectuer des réglages pour iOS 6.1 sans affecter la mise en page de iOS 7.

Enter image description here

Si vous travaillez sur le storyboard, c'est fondamentalement la même chose. Vous choisissez un objet de contrôleur de vue, puis cliquez sur le mode éditeur adjoint, choisissez "Aperçu", puis "iOS7 et versions ultérieures" ... 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, alors veuillez préciser s'il y a des malentendus ou d'autres astuces.

8
Kaz Yoshikawa

Il n'y a pas besoin de construire multi-xib. Je pense que votre problème est le "20px": le même fichier XIB a fière allure dans iOS 6, mais il manque 20 pixels dans iOS 7.

Par exemple, vous avez une vue et c'est Y = 0. Dans iOS 6, il est situé en bas de la barre d'état. Dans iOS 7, il apparaît au-dessus de la barre d'état.

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

  1. Sélectionnez l'inspecteur de fichier et basculez "Afficher en tant que" sur "iOS 7 et versions ultérieures".

  2. Sélectionnez un inspecteur de taille et remplissez la fenêtre avec "-20"

  3. C'est fait!

3
DongXu

Vous devez juste une fois vérifier votre taille principale UIView pour iOS 7.0 et ultérieur et iOS 6.0 et inférieur, vous aurez probablement une idée.

Depuis iOS 7, Apple a changé la taille de la vue principale = fixe. Cela signifie que si vous ajoutez une barre de navigation, la taille de la vue reste identique [iPhone 4s: 320 * 480, iPhone 5: 320 * 568].

0
imDeveloper