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.
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 actuellementwantsFullScreenLayout = 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 typeUIRectEdge
, qui spécifie chacun des quatre bords d'un rectangle, en plus de spécifiant aucun et tout. UtilisezedgesForExtendedLayout
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é estUIRectEdgeAll
.
- 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 deextendedLayoutIncludesOpaqueBars
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 deautomaticallyAdjustsScrollViewInsets
est Oui .)
- topLayoutGuide, bottomLayoutGuide
les propriétés
topLayoutGuide
etbottomLayoutGuide
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 detopLayoutGuide
ou au haut de bottomLayoutGuide. (Si aucune barre ne doit chevaucher la vue, le bas detopLayoutGuide
est le même que le haut de l'écran et le haut debottomLayoutGuide
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
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.
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.
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];
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).
solution Swift 3 / Swift 4 qui fonctionne également avec les fichiers NIBs/XIB dans iOS 10+:
override func viewDidLoad() {
super.viewDidLoad()
edgesForExtendedLayout = []
}
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);
}
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
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 .
l'astuce la plus simple est d'ouvrir le fichier NIB et de faire ces deux simples étapes:
- il suffit d'appuyer sur cette touche et de la régler à celle que vous préférez:
- 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)
et le résultat :
Solution Swift:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.edgesForExtendedLayout = UIRectEdge.None
}
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;
}
}
Swift 3
override func viewWillAppear(_ animated: Bool) {
self.edgesForExtendedLayout = []
}
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é.
il suffit de définir le code suivant en vue apparaîtra.
if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
pour moi, la solution la plus simple est d'ajouter deux touches dans le plist
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:
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!!
É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.....
dans mon cas ayant loadView () interrompu
ce code:
auto.edgesForExtendedLayout = UIRectEdgeNone
mais après avoir supprimé loadView () tout a bien fonctionné
Swift 4.2 - Xcode 10.0 - iOS 12.0:
if #available(iOS 11.0, *) {} else {
self.edgesForExtendedLayout = []
self.navigationController?.view.backgroundColor = .white
}