Barre d'état et barre de navigation apparaissent sur les limites de ma vue dans iOS 7

j'ai récemment téléchargé Xcode 5 DP pour tester mes applications dans iOS 7. La première chose que j'ai remarquée et confirmée est que les limites de ma vue ne sont pas toujours redimensionnées pour tenir compte de la barre d'état et de la barre de navigation.

Dans viewDidLayoutSubviews , j'ai l'impression de la vue de limites:

{{0, 0}, {320, 568}}

résultat: Mon contenu apparaît sous la barre de navigation et la barre d'état.

je sais que je pourrais rendre compte de la hauteur moi-même en obtenant la hauteur de l'écran principal, en soustrayant la hauteur de la barre d'état et la hauteur de la barre de navigation, mais cela semble comme le travail supplémentaire inutile.

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

mise à jour:

j'ai trouvé une solution pour ce problème spécifique. Définissez la propriété translucide de la barre de navigation à NO:

self.navigationController.navigationBar.translucent = NO;

cela va corriger la vue d'être encadré sous la barre de navigation et la barre d'état.

cependant, je n'ai pas trouvé de solution pour le cas quand vous voulez que la barre de navigation soit translucide. Par exemple, en regardant une photo plein écran, je souhaite avoir la barre de navigation translucide, et la vue d'être encadré en dessous. Cela fonctionne, mais quand je bascule montrant / cacher la barre de navigation, j'ai connu des résultats encore plus étranges. Le premier subview (un UIScrollView) obtient son origine a changé à chaque fois.

421
demandé sur Peter Mortensen 2013-06-13 00:06:41

20 réponses

vous pouvez y parvenir en implémentant une nouvelle propriété appelée edgesForExtendedLayout dans iOS7 SDK. Pour ce faire, veuillez ajouter le code suivant:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

vous devez ajouter ce qui précède dans votre méthode -(void)viewDidLoad .

iOS 7 apporte plusieurs changements à la façon dont vous apparence de votre UI . Les changements dans la disposition de vue-controller, teinte couleur, et la fonte affecter tous les UIKit des objets dans votre application. Dans en outre, des améliorations à l'APIs de reconnaissance gestuelle vous donner plus fin grained contrôle sur les interactions gestuelles.

Utilisant Des Contrôleurs De Vue

Dans iOS 7, voir utilisation de contrôleurs de plein écran de mise en page. Dans le même temps, iOS 7 vous donne plus de contrôle granulaire sur la façon dont un contrôleur de vue expose son point de vue. En particulier, le concept de présentation en plein écran a été affiné pour permettre à un contrôleur de vue de spécifier la disposition de chaque bord de son point de vue.

la propriété du contrôleur de vue wantsFullScreenLayout est dépréciée en iOS 7. Si vous spécifiez actuellement wantsFullScreenLayout = NO , la vue le contrôleur peut afficher son contenu à un emplacement d'écran inattendu quand il fonctionne dans iOS 7.

pour ajuster la façon dont un contrôleur de vue affiche ses vues, UIViewController fournit les propriétés suivantes:

  • edgesForExtendedLayout

la propriété edgesForExtendedLayout utilise le type UIRectEdge , qui spécifie chacun des quatre bords d'un rectangle, en plus de spécifiant aucun et tout. Utilisez edgesForExtendedLayout pour préciser les bords d'une vue doivent être étendus, indépendamment de la translucidité de la barre. Par par défaut, la valeur de cette propriété est UIRectEdgeAll .

  • rallongéepour inclure les barres d'écartement

si votre dessin utilise des barres opaques, affinez edgesForExtendedLayout par définir également la propriété extendedLayoutIncludesOpaqueBars à NON . (La valeur par défaut de extendedLayoutIncludesOpaqueBars est NO .)

  • automaticallyAdjustsScrollViewInsets

si vous ne voulez pas un contenu de scroll view les encarts automatiquement ajusté, mettre automaticallyAdjustsScrollViewInsets à Non . (Le la valeur par défaut de automaticallyAdjustsScrollViewInsets est Oui .)

  • topLayoutGuide, bottomLayoutGuide

les propriétés topLayoutGuide et bottomLayoutGuide indiquent emplacement des bords de la barre supérieure ou inférieure dans la vue d'un contrôleur de vue. Si les barres doivent chevaucher le haut ou le bas d'un point de vue, vous pouvez utiliser Interface Builder pour positionner la vue par rapport à la barre en créant contraintes au bas de topLayoutGuide ou au haut de bottomLayoutGuide. (Si aucune barre ne doit chevaucher la vue, le bas de topLayoutGuide est le même que le haut de l'écran et le haut de bottomLayoutGuide est le même que le bas de la vue.) À la fois les propriétés sont créées par la suite.

s'il vous Plaît se référer, apple doc

491
répondu Nandha 2015-04-20 14:22:03

vous n'avez pas à calculer jusqu'où tout déplacer vers le bas, Il ya une construction dans la propriété pour cela. Dans Interface Builder, mettez en surbrillance votre contrôleur de vue, puis naviguez vers l'Inspecteur des attributs. Ici, vous verrez des cases à cocher à côté des mots "étendre les bords". Comme vous pouvez le voir, dans la première capture d'écran, la sélection par défaut est que le contenu apparaisse sous les barres supérieure et inférieure, mais pas sous les barres opaques, ce qui est pourquoi le réglage du style de barre de ne pas translucide travaillé pour vous.

comme vous pouvez le voir un peu dans la première capture d'écran, il y a deux éléments UI cachés sous la barre de navigation. (J'ai activé les wireframes en IB pour illustrer ceci) ces éléments, UIButton et UISegmentedControl ont tous deux leur origine "y" définie à zéro, et le contrôleur de vue est défini pour autoriser le contenu sous la barre supérieure.

enter image description here

cette deuxième capture d'écran montre ce qui se passe lorsque vous désélectionnez le "sous Top Bars " case à cocher. Comme vous pouvez le voir, la vue des contrôleurs de vue a été décalée vers le bas de façon appropriée pour son origine y à droite sous la barre de navigation.

enter image description here

cela peut également être accompli par programmation À travers l'utilisation de -[UIViewController edgesForExtendedLayout] . Voici un lien vers la référence de classe pour edgeForExtendedLayout , et pour UIRectEdge

[self setEdgesForExtendedLayout:UIRectEdgeNone];
109
répondu Mick MacCallum 2013-09-13 12:14:34

j'ai créé ma vue programmatique et cela a fini par fonctionner pour moi:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Source (dans topLayoutGuide de la section au bas de la page.39).

33
répondu Stunner 2014-01-03 22:48:26

solution Swift 3 / Swift 4 qui fonctionne également avec les fichiers NIBs/XIB dans iOS 10+:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}
21
répondu flo_23 2018-02-27 12:31:12

si vous voulez que la vue ait la barre de nav translucide (ce qui est plutôt sympa) vous devez configurer un contentInset ou similaire.

Voici comment je fais:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}
10
répondu Magnus 2013-09-13 09:16:08

edgesForExtendedLayout fait le truc pour iOS 7. Cependant, si vous construisez l'application à travers iOS 7 SDK et la déployez dans iOS 6, la barre de navigation apparaît translucide et les vues vont en dessous. Ainsi, pour le fixer à la fois pour iOS 7 et pour iOS 6, Faites ceci:

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
9
répondu Raj Pawan Gumdal 2013-09-21 05:18:57

dans votre fichier apps plist ajouter une ligne, l'appeler" afficher l'apparence de la barre d'état basée sur le contrôleur "et le mettre à Non .

9
répondu Idan 2014-01-03 21:29:18

l'astuce la plus simple est d'ouvrir le fichier NIB et de faire ces deux simples étapes:

  1. il suffit d'appuyer sur cette touche et de la régler à celle que vous préférez:

Enter image description here

  1. sélectionnez ceux Uiview's/Uiimageview's... que tu veux être déplacée vers le bas. Dans mon cas, seul le logo était superposé et j'ai réglé le delta à + 15; (ou -15 si vous avez choisi iOS 7 à l'étape 1)

Enter image description here

et le résultat :

Before After

7
répondu Riskov 2014-01-07 10:21:52

Solution Swift:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}
5
répondu fatihyildizhan 2018-08-16 13:50:17

je voudrais développer la réponse de Stunner, et Ajouter un if déclaration pour vérifier si elle est iOS-7, parce que lorsque je l'ai testé sur iOS 6 mon application se serait écrasé.

l'ajout ajouterait:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

donc je suggère d'ajouter cette méthode à votre fichier MyViewControler.m :

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}
4
répondu werdsackjon 2014-01-03 21:39:31

Swift 3

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}
4
répondu Shahrukh 2017-07-04 07:27:21

j'ai un scénario où j'utilise le BannerViewController écrit par Apple pour afficher mes annonces et un ScrollViewController intégré dans le BannerViewController.

Pour prévenir la barre de navigation de cacher mon contenu, j'ai dû faire deux changements.

1) Modifier BannerViewController.m

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2) Modifier mon ScrollViewContoller

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

maintenant les annonces apparaissent correctement en bas de la vue au lieu d'être couvert par la barre de Navigation et le contenu sur le haut n'est pas coupé.

3
répondu Xavier John 2013-10-21 16:35:20

il suffit de définir le code suivant en vue apparaîtra.

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }
2
répondu Amit Shelgaonkar 2015-06-30 17:57:56

faire une contrainte à la mise en page supérieure comme ceci enter image description here

2
répondu carmen_munich 2015-09-10 09:00:04

pour moi, la solution la plus simple est d'ajouter deux touches dans le plist

enter image description here

1
répondu giuseppe 2013-10-03 10:28:36

ajouter la touche "afficher l'apparence de la barre D'état basée sur le contrôleur" dans la liste déroulante comme une ligne dans info.plist . Quelque chose comme ceci:

Enter image description here

1
répondu Kursat Turkay 2014-01-03 21:36:09

j'ai eu le même problème avec mon application par iPads (armv7, armv7s, amr64) seulement en présentant un autre UIViewController et après les rejeter va nav barre sous la barre de statut... Je passe beaucoup de temps à trouver de solution pour cela. J'utilise storyboard et InterfaceBuilder pour UIViewController ce qui rend terrible je mets la présentation à partir de FullScreen -> contexte actuel et il corriger cette question. Il ne fonctionne dans mon application que pour iPads => iOS8.0 (testing with iOS8.1) et pour les iPads avec iOS 7.1 Non travail!! see screenshot

1
répondu Alexej W. 2015-01-30 10:00:11

Étapes Pour Masquer la barre d'état dans iOS 7:

1.Accédez à votre application info.dossier plist.

2.Et Set, afficher la barre d'état basée sur le contrôleur apparence: booléen NO

J'espère avoir résolu le problème de la barre de statut.....

0
répondu chandrika 2014-01-30 11:46:13

dans mon cas ayant loadView () interrompu

ce code: auto.edgesForExtendedLayout = UIRectEdgeNone

mais après avoir supprimé loadView () tout a bien fonctionné

0
répondu DevB2F 2017-03-01 05:10:32

Swift 4.2 - Xcode 10.0 - iOS 12.0:

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}
0
répondu juliancadi 2018-08-25 12:18:23