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.
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.
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.
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
.
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;
Cela fonctionne aussi pour Swift sur iOS 8.1
navigationController?.navigationBar.translucent = false
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];
Swift 4 :
Définissez la ligne de code suivante dans la méthode viewDidLoad:
self.navigationController?.navigationBar.isTranslucent = false
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);
}
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.
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.