Comment empêcher UINavigationBar de couvrir le haut de la vue dans iOS 7?


99

Après la mise à jour vers Xcode 5, les barres de navigation de toutes les vues de mon application se sont déplacées vers le bas. Voici quelques captures d'écran, la première montrant tout dans la vue telle qu'elle est déroulée, et la seconde montrant tout cela intact. La barre de recherche doit commencer là où la barre de navigation.

Tout le contenu Tout le contenu en veille

Quelqu'un sait comment je peux résoudre ce problème?

edit: j'ai essayé cette recommandation précédemment:

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

Mais cela donne des résultats très étranges.

Tentative de solution

Cela peut être dû au fait que j'ai un "menu de diapositives" sous ce contrôleur de vue qui apparaît en raison de la transparence de la barre de navigation.


Voici une autre solution à ce problème. stackoverflow.com/a/51491645/10148333
Afonso

Réponses:


235

Définissez la propriété translucide de la barre de navigation sur NON :

self.navigationController.navigationBar.translucent = NO;

Cela empêchera la vue d'être encadrée sous la barre de navigation et la barre d'état.

Si vous devez afficher et masquer la barre de navigation, utilisez

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

dans votre viewDidLoadméthode.


1
J'ai placé ceci sous viewDidLoadmais cela ne donne aucun changement.
Sam D20

13
make it in viewDidLayoutSubviews funtions
Hindu

1
L'ajout de ceci à viewDidLayoutSubviews a fait l'affaire. J'apprécie l'aide messieurs!
Sam D20

Salut, une question? ou est-ce un compliment?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; m'a aidé
luky

32

Par iOS 7défaut , la valeur de la propriété translucide du contrôleur est OUI, vous définissez donc la propriété translucide NON pour ce problème.

self.navController.navigationBar.translucent = NO;

2
Il n'y a pas de propriété "navController". Utilisez ceci: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

Je crée l'objet navigtionbarcontroller dans le délégué d'application et donne le nom navController.
Sumit Mundra

21

Vous pouvez désactiver le "Prolonger les bords" dans l'inspecteur d'attributs du contrôleur de vue de cet écran (comme indiqué dans l'image ci-dessous):

entrez la description de l'image ici


12

Cela fonctionne également pour Swift sur iOS 8.1

navigationController?.navigationBar.translucent = false

8

Si vous souhaitez conserver la translucidité sur votre navigationBar, à la fin de votre viewDidLoadou dans votre viewWillAppearajoutez cette ligne de code:

[self.view sendSubviewToBack:self.tableView]

D'une certaine façon , si votre scrollViewsous - classe ( UITableView, UICollectionView, etc.) est à index0 dans la vue actuelle subviews, il ajuste automatiquement EISN en fonction de votre navigationBar. Et cela ne devrait pas non plus affecter votre interface utilisateur dans les versions antérieures à iOS7.


EDIT Si vous initialisez votre UITableViewprogramme par programmation, il est préférable de l'ajouter à la vue en utilisant ce[self.view insertSubview:self.tableView atIndex:0];


Cela devrait être la bonne réponse. Si vous ajoutez la sous-vue par programme, vous pouvez simplement le faire [self.view insertSubview:self.tableView atIndex:0];au lieu de l'envoyer à l'arrière après l'avoir ajouté.
smitt04

Correct. Mais sans savoir comment il initie son contrôleur (par programmation, constructeur d'interface), nous ne pouvons pas supposer que c'est la meilleure solution. Bien que j'ai modifié ma réponse.
jbouaziz

Cela fonctionne mais ressemble à un hack. Y a-t-il un avis dans la documentation officielle à ce sujet?
John Tracid du

4

Swift 4 :

Définissez la ligne de code suivante dans la méthode viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

Vous pouvez ajouter cette méthode dans votre contrôleur de vue comme indiqué sur cette URL :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Une autre approche consiste à définir self.automaticallyAdjustsScrollViewInsets = YES; sur votre contrôleur de vue. C'est activé par défault. Mais dans votre cas:

Je vois que vous utilisez EGORefreshHeaderView. Il joue avec contentInset de UITableView. Ainsi, lorsque vous le relâchez, l'en-tête réinitialisera l'encart supérieur au lieu de restaurer la valeur précédente.


-1

Si vous souhaitez avoir un contrôle complet sur les vues et éviter les ajustements erronés d'iOS, sous-classez UITableView et ajustez les inserts (défilement et indicateurs) dans - (void) willMoveToWindow: (UIWindow *) newWindow. Travaille pour moi.


-4

Une autre option consiste à ouvrir votre fichier Info.plist en mode code source et à saisir les informations suivantes:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

J'espère que cela t'aides.


1
Je ne pense pas que cela affecterait du tout la vue.
Enrico Susatyo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.