web-dev-qa-db-fra.com

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

Après la mise à jour vers Xcode 5, les barres de navigation de toutes les vues de mon application ont été rétrogradées. Voici quelques captures d'écran, la première montrant tout ce qui se trouve dans la vue lorsqu'elle est réduite, et la seconde montrant l'intégralité de celle-ci. La barre de recherche doit commencer par la barre de navigation. 

All ContentAll Content on Idle

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

edit: j'ai déjà essayé cette recommandation: 

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

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

Solution Attempt

C'est peut-être parce 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. 

96
Sam D20

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

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 méthode viewDidLoad.

225
Deepesh

Dans iOS 7 par défaut toute 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;
30
Sumit Mundra

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

 enter image description here

21
Achyut Sagar

Cela fonctionne aussi pour Swift sur iOS 8.1

navigationController?.navigationBar.translucent = false
11
uplearnedu.com

Si vous souhaitez conserver la transparence de votre navigationBar, à la fin de votre viewDidLoad ou dans votre viewWillAppear, ajoutez cette ligne de code:

[self.view sendSubviewToBack:self.tableView]

D'une manière ou d'une autre, si votre sous-classe scrollView (UITableView, UICollectionView, etc.) est à index 0 dans votre affichage actuel subviews, il ajustera automatiquement les incrustations 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 UITableView par programme, il est préférable de l'ajouter à la vue à l'aide de ce [self.view insertSubview:self.tableView atIndex:0];

8
jbouaziz

Swift 4 :

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

self.navigationController?.navigationBar.isTranslucent = false
4
Md. Najmul Hasan

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

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

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

Je vois que vous utilisez EGORefreshHeaderView. Il joue avec contentInset of UITableView. Ainsi, lorsque vous le relâchez, header réinitialisera top inset au lieu de restaurer la valeur précédente.

2
Krivoblotsky

Les réponses ci-dessus peuvent résoudre votre problème, mais soulèvent de nombreux autres problèmes, par exemple:.

Le fait que la barre de navigation soit translucide ne pose pas ce problème, ni le problème que vous avez signalé dans iOS 11+. Cependant, je n'ai trouvé aucune solution de contournement pour le faire fonctionner sur toutes les plateformes iOS à partir d'iOS 9.

0
Mr Jox