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'imprime les limites de la vue:
{{0, 0}, {320, 568}}
Il en résulte que mon contenu apparaît sous la barre de navigation et la barre d'état.
Je sais que je pourrais tenir 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 être un travail supplémentaire inutile.
Comment puis-je résoudre ce problème?
Mise à jour:
J'ai trouvé une solution à ce problème spécifique. 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.
Cependant, je n'ai pas trouvé de correctif pour le cas lorsque vous souhaitez que la barre de navigation soit translucide. Par exemple, en visionnant une photo en plein écran, je souhaite que la barre de navigation soit translucide et que la vue soit encadrée en dessous. Cela fonctionne, mais lorsque je bascule pour afficher / masquer la barre de navigation, j'ai rencontré des résultats encore plus étranges. La première sous-vue (un UIScrollView) obtient ses limites y l'origine changée à chaque fois.
Réponses:
Vous pouvez y parvenir en implémentant une nouvelle propriété appelée
edgesForExtendedLayout
dans le SDK iOS7. Veuillez ajouter le code suivant pour y parvenir,Vous devez ajouter ce qui précède dans votre
-(void)viewDidLoad
méthode.Veuillez vous référer, apple doc
la source
Vous n'avez pas à calculer jusqu'où tout baisser, il existe une propriété intégrée pour cela. Dans Interface Builder, mettez en surbrillance votre contrôleur de vue, puis accédez à l'inspecteur d'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, c'est pourquoi la définition du style de barre sur non translucide a fonctionné pour vous.
Comme vous pouvez le constater dans la première capture d'écran, deux éléments d'interface utilisateur se cachent sous la barre de navigation. (J'ai activé les wireframes dans IB pour illustrer cela) Ces éléments, un UIButton et un UISegmentedControl ont tous deux leur origine "y" définie sur 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écochez la case "Sous les barres supérieures". Comme vous pouvez le voir, la vue des contrôleurs de vue a été déplacée vers le bas de manière appropriée pour que son origine y soit juste sous la barre de navigation.
Cela peut également être accompli par programme grâce à l'utilisation de
-[UIViewController edgesForExtendedLayout]
. Voici un lien vers la référence de classe pour edgeForExtendedLayout et pour UIRectEdgela source
J'ai créé ma vue par programme et cela a fini par fonctionner pour moi:
Source (dans la section topLayoutGuide au bas de la page 39).
la source
topLayoutGuide
est seulement iOS 7.Solution Swift 3 / Swift 4 qui fonctionne également avec les fichiers NIB / XIB dans iOS 10+:
la source
Si vous voulez que la vue ait la barre de navigation translucide (ce qui est plutôt sympa), vous devez configurer un contentInset ou similaire.
Voici comment je le fais:
la source
contentInset
est une propriété deUIScrollView
. Et si mon point de vue principal n'est pas une sous-classe deUIScrollView
. Comment puis-je résoudre le problème de chevauchement?edgesForExtendedLayout
fait l'affaire pour iOS 7. Cependant, si vous créez l'application sur le SDK iOS 7 et la déployez dans iOS 6, la barre de navigation apparaît translucide et les vues se trouvent en dessous. Donc, pour le réparer à la fois pour iOS 7 et pour iOS 6, procédez comme suit:la source
Dans le fichier plist de vos applications, ajoutez une ligne, appelez-la "Afficher l'apparence de la barre d'état basée sur le contrôleur" et définissez-la sur NO .
la source
L'astuce la plus simple consiste à ouvrir le fichier NIB et à effectuer ces deux étapes simples:
Et le résultat :
la source
Solution rapide:
la source
super.viewWillAppear(animated)
Je voudrais développer la réponse de Stunner et ajouter une
if
déclaration pour vérifier s'il s'agit d'iOS-7, car lorsque je le testais sur iOS 6, mon application plantait.L'addition ajouterait:
Je suggère donc d'ajouter cette méthode à votre
MyViewControler.m
fichier:la source
Swift 3
la source
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 empêcher la barre de navigation de masquer mon contenu, j'ai dû apporter deux modifications.
1) Modifier BannerViewController.m
2) Modifier mon ScrollViewContoller
Maintenant, les annonces s'affichent correctement en bas de la vue au lieu d'être couvertes par la barre de navigation et le contenu en haut n'est pas coupé.
la source
il suffit de définir le code suivant en vue apparaîtra.
la source
créer une contrainte à la disposition supérieure comme celle-ci
la source
Swift 4.2 - Xcode 10.0 - iOS 12.0:
la source
Pour moi, la solution la plus simple consiste à ajouter deux clés dans le plist
la source
Ajoutez la clé "Afficher l'apparence de la barre d'état basée sur le contrôleur" dans la liste déroulante sous la forme d'une ligne
info.plist
. Quelque chose comme ça:la source
J'ai eu le même problème avec mon application sur les iPads (armv7, armv7s, amr64) qu'en présentant un autre UIViewController et après les avoir rejetés, la barre de navigation s'affiche sous la barre d'état ... Je passe beaucoup de temps à trouver une solution pour cela. J'utilise le storyboard et dans InterfaceBuilder pour UIViewController, ce qui rend terrible la définition de la présentation à partir de FullScreen -> Contexte actuel et cela résout ce problème. Cela fonctionne dans mon application uniquement pour les iPads => iOS8.0 (test avec iOS8.1) et pour les iPads avec iOS 7.1 ne fonctionne pas !!
la source
Étapes pour masquer la barre d'état dans iOS 7:
1.Accédez au fichier info.plist de votre application.
2.Et définir, afficher l'apparence de la barre d'état basée sur le contrôleur: booléen NON
J'espère que j'ai résolu le problème de la barre d'état .....
la source
Dans mon cas, avoir loadView () a interrompu
ce code: self.edgesForExtendedLayout = UIRectEdgeNone
mais après avoir supprimé loadView () tout a bien fonctionné
la source