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.

Sam D20
la source
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.

Deepesh
la source
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;
Sumit Mundra
la source
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

Achyut Sagar
la source
12

Cela fonctionne également pour Swift sur iOS 8.1

navigationController?.navigationBar.translucent = false
uplearnedu.com
la source
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];

jbouaziz
la source
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
Md. Najmul Hasan
la source
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);
}
malkoty
la source
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.

Krivoblotsky
la source
-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.

Farhad Malekpour
la source
-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.

Nicoli
la source
1
Je ne pense pas que cela affecterait du tout la vue.
Enrico Susatyo