Dans iOS 7, le UIStatusBar
a été conçu de manière à fusionner avec la vue comme ceci:
(GUI conçue par Tina Tavčar )
C'est cool, mais cela va un peu gâcher votre vue lorsque vous avez quelque chose dans la partie supérieure de votre vue, et il se chevauche avec la barre d'état.
Existe-t-il une solution simple (telle que la définition d'une propriété dans info.plist) qui peut changer la façon dont cela fonctionne [sans se chevaucher] pour revenir à ce qu'elle est dans iOS6?
Je sais qu'une solution plus simple consiste à avoir
self.view.center.x
+ 20 points pour chaque contrôleur de vue unique, mais les changer va bousiller d'autres dimensions (avoir un autreself.view.center.x
peut causer des problèmes aux séquences personnalisées, etc.) et soudain, cela se transforme en un travail fastidieux qui est à éviter.Je serai vraiment heureux si quelqu'un peut me fournir une solution à un revêtement pour cela.
PS Je sais que je peux cacher la barre d'état en faisant des choses comme avoir
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
Dans la didFinishLaunchingWithOptions
méthode, mais c'est une solution de contournement, un raccourci évitant le problème, donc je ne considère pas que c'est une vraie solution.
UIStatusBarDefault
de la barre d'état ne fait que rendre son contenu de couleur noire. Cela ne reviendra pas à la façon dont il fonctionne dans iOS6.Réponses:
Ceci est une publication croisée d' un article de blog que j'ai écrit , mais voici un aperçu complet des barres d'état, des barres de navigation et des contrôleurs de vue de conteneur sur iOS 7:
Il n'y a aucun moyen de conserver la disposition de la barre d'état de style iOS 6. La barre d'état chevauchera toujours votre application sur iOS 7
Ne confondez pas l'apparence de la barre d'état avec la disposition de la barre d'état. L'apparence (claire ou par défaut) n'affecte pas la disposition de la barre d'état (cadre / hauteur / chevauchement). Il est également important de noter que la barre d'état du système n'a plus de couleur d'arrière-plan. Lorsque l'API fait référence à UIStatusBarStyleLightContent, cela signifie du texte blanc sur un fond clair. UIStatusBarStyleDefault est un texte noir sur fond clair.
L'apparence de la barre d'état est contrôlée le long de l'un des deux chemins de base mutuellement exclusifs: vous pouvez soit les définir par programme de la manière traditionnelle, soit UIKit mettra à jour l'apparence pour vous en fonction de certaines nouvelles propriétés de UIViewController. Cette dernière option est activée par défaut. Vérifiez la valeur de plist de votre application pour «Apparence de la barre d'état basée sur ViewController» pour voir celle que vous utilisez. Si vous définissez cette valeur sur YES, chaque contrôleur de vue de niveau supérieur de votre application (autre qu'un contrôleur de vue de conteneur UIKit standard) doit remplacer la propriété PreferredStatusBarStyle, en renvoyant le style par défaut ou le style léger. Si vous modifiez la valeur plist sur NO, vous pouvez gérer l'apparence de la barre d'état à l'aide des méthodes UIApplication connues.
UINavigationController modifiera la hauteur de son UINavigationBar à 44 points ou 64 points, en fonction d'un ensemble de contraintes plutôt étrange et non documenté. Si UINavigationController détecte que le haut du cadre de sa vue est visuellement contigu avec le haut de son UIWindow, il dessine sa barre de navigation avec une hauteur de 64 points. Si le sommet de sa vue n'est pas contigu au sommet de l'UIWindow (même s'il n'est décalé que d'un seul point), il dessine sa barre de navigation de la manière «traditionnelle» avec une hauteur de 44 points. Cette logique est exécutée par UINavigationController même s'il y a plusieurs enfants dans la hiérarchie du contrôleur de vue de votre application. Il n'existe aucun moyen d'empêcher ce comportement.
Si vous fournissez une image d'arrière-plan de barre de navigation personnalisée qui ne mesure que 44 points (88 pixels) et que les limites de la vue de UINavigationController correspondent aux limites de UIWindow (comme expliqué au point 4), UINavigationController dessinera votre image dans le cadre (0,20,320 , 44), laissant 20 points d'espace noir opaque au-dessus de votre image personnalisée. Cela peut vous amener à penser que vous êtes un développeur intelligent qui a contourné la règle n ° 1, mais vous vous trompez. La barre de navigation mesure toujours 64 points. L'incorporation d'un UINavigationController dans une hiérarchie de vues de style diapositive-à-révéler rend cela très clair.
Méfiez-vous de la propriété edgeForExtendedLayout nommée avec confusion de UIViewController. L'ajustement des bords ForExtendedLayout ne fait rien dans la plupart des cas. La seule façon dont UIKit utilise cette propriété est si vous ajoutez un contrôleur de vue à un UINavigationController, puis l'UINavigationController utilise bordsForExtendedLayout pour déterminer si son contrôleur de vue enfant doit être visible sous la barre de navigation / zone de barre d'état. La définition de edgeForExtendedLayout sur l'UINavigationController lui-même ne change rien au fait que l'UINavigationController possède ou non une zone de barre de navigation haute de 44 ou 64 points. Voir # 4 pour cette logique. Une logique de disposition similaire s'applique au bas de votre vue lorsque vous utilisez une barre d'outils ou UITabBarController.
Si tout ce que vous essayez de faire est d'empêcher votre contrôleur de vue enfant personnalisé de sous-chevaucher la barre de navigation lorsqu'il est à l'intérieur d'un UINavigationController, définissez bordsForExtendedLayout sur UIRectEdgeNone (ou au moins un masque qui exclut UIRectEdgeTop). Définissez cette valeur le plus tôt possible dans le cycle de vie de votre contrôleur de vue.
UINavigationController et UITabBarController essaieront également de remplir les contentInsets des vues de table et des vues de collection dans sa hiérarchie de sous-vues. Il le fait d'une manière similaire à la logique de la barre d'état de # 4. Il existe un moyen par programme d'empêcher cela, en définissant automatiquementAdjustsScrollViewInsets sur NO pour vos vues de table et vues de collection (il est par défaut YES). Cela a posé de sérieux problèmes pour Whisper et Riposte, car nous utilisons des ajustements contentInset pour contrôler la disposition des vues de table en réponse aux mouvements de la barre d'outils et du clavier.
Pour réitérer: il n'y a aucun moyen de revenir à la logique de disposition de la barre d'état de style iOS 6. Pour approximer cela, vous devez déplacer tous les contrôleurs de vue de votre application dans une vue de conteneur décalée de 20 points du haut de l'écran, laissant une vue intentionnellement noire derrière la barre d'état pour simuler l'ancienne apparence. C'est la méthode que nous avons finalement utilisée dans Riposte et Whisper.
Apple met tout en œuvre pour que vous n'essayiez pas de faire # 9. Ils veulent que nous remodelions toutes nos applications pour sous-chevaucher la barre d'état. Cependant, il existe de nombreux arguments convaincants, à la fois pour l'expérience utilisateur et pour des raisons techniques, pourquoi ce n'est pas toujours une bonne idée. Vous devez faire ce qui est le mieux pour vos utilisateurs et ne pas simplement suivre la fantaisie de la plate-forme.
la source
Il n'y a apparemment aucun moyen de ramener la barre d'état iOS7 à son fonctionnement dans iOS6.
Cependant, nous pouvons toujours écrire des codes et transformer la barre d'état en iOS6, et c'est le moyen le plus court que je puisse trouver:
Défini
UIViewControllerBasedStatusBarAppearance
surNO
ininfo.plist
(pour désactiver la possibilité pour les contrôleurs de vue d'ajuster le style de la barre d'état afin que nous puissions définir le style de la barre d'état à l'aide de la méthode UIApplicationstatusBarStyle.)Dans AppDelegate
application:didFinishLaunchingWithOptions
, appelezafin de:
Vérifiez si c'est iOS 7.
Définissez le contenu de la barre d'état sur blanc, par opposition à UIStatusBarStyleDefault.
Évitez que les sous-vues dont les images s'étendent au-delà des limites visibles ne s'affichent (pour les vues animées dans la vue principale depuis le haut).
Créez l'illusion que la barre d'état prend de la place comme dans iOS 6 en déplaçant et en redimensionnant le cadre de la fenêtre de l'application.
Pour les applications avec rotation d'écran,
utiliser NSNotificationCenter pour détecter les changements d'orientation en ajoutant
dans
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
et créez une nouvelle méthode dans AppDelegate:De sorte que lorsque l'orientation change, il déclenche une instruction de commutation pour détecter l'orientation de l'écran de l'application (Portrait, à l'envers, paysage gauche ou paysage droit) et modifier le cadre de la fenêtre de l'application respectivement pour créer l'illusion de la barre d'état iOS 6.
Pour modifier la couleur d'arrière-plan de votre barre d'état:
Ajouter
en
AppDelegate.h
pour fairebackground
une propriété dans votre classe et empêcher l' ARC de désaffecter il. (Vous n'êtes pas obligé de le faire si vous n'utilisez pas ARC.)Après cela, il vous suffit de créer l'interface utilisateur dans
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
:N'oubliez pas
@synthesize background;
après@implementation AppDelegate
!la source
J'ai résolu le problème avec le code suivant. C'est pour ajouter une barre d'état. didFinishLaunchingWithOptionsEt pour Interface Builder, c'est pour quand vous ouvrez avec iOS 6; il commence à 0 pixels.Remarque: les deltas iOS 6/7 n'apparaissent que si vous décochez "Utiliser la mise en page automatique" pour le contrôleur de vue dans "l'inspecteur de fichiers" (icône la plus à gauche) dans le volet de détails.la source
SOLUTION :
Définissez-le dans votre viewcontroller ou dans rootviewcontroller en remplaçant la méthode:
la source
Voici une autre approche pour les projets qui utilisent largement le Storyboard:
OBJECTIF:
Le but de cette approche est de recréer le même style de barre d'état dans iOS7 que dans iOS6 (voir le titre de la question "Barre d'état iOS 7 Retour au style iOS 6?").
RÉSUMÉ:
Pour ce faire, nous utilisons le Storyboard autant que possible en déplaçant les éléments d'interface utilisateur qui se chevauchent par la barre d'état (sous iOS 7) vers le bas, tout en utilisant des deltas pour annuler le changement de disposition vers le bas pour iOS 6.1 ou antérieur. L'espace supplémentaire résultant dans iOS 7 est ensuite occupé par une UIView avec le backgroundColor défini sur une couleur de notre choix. Ce dernier peut être créé en code ou en utilisant le Storyboard (voir ALTERNATIVES ci-dessous)
HYPOTHÈSES:
Pour obtenir le résultat souhaité en suivant les étapes ci-dessous, il est supposé qu'il
View controller-based status bar appearance
est défini sur NO et que votreStatus bar style
est défini sur "Style noir transparent (alpha de 0,5)" ou "Style noir opaque". Les deux paramètres peuvent être trouvés / ou ajoutés sous "Info" dans les paramètres de votre projet.PAS:
Ajoutez une sous-vue à la fenêtre d'interface utilisateur pour servir d'arrière-plan à la barre d'état. Pour ce faire, ajoutez ce qui suit à votre AppDelegate
application: didFinishLaunchingWithOptions:
aprèsmakeKeyAndVisible
Étant donné que vous avez ajouté par programmation un arrière-plan pour iOS 7 UNIQUEMENT, vous devrez ajuster la disposition de vos éléments d'interface utilisateur qui se chevauchent en conséquence en conservant leur disposition pour iOS6. Pour ce faire, procédez comme suit:
Use Autolayout
case n'est pas cochée pour votre Storyboard (c'est parce que sinon "iOS 6/7 Deltas" n'est pas affiché dans l'inspecteur de taille). Pour faire ça:ALTERNATIVES:
Pour ajouter encore moins de code dans les projets riches en storyboard et pour faire pivoter automatiquement l'arrière-plan de la barre d'état, au lieu d'ajouter par programme un arrière-plan pour votre barre d'état, vous pouvez ajouter une vue colorée à chaque contrôleur de vue qui se trouve tout en haut de la vue principale dudit contrôleur de vue. Vous changeriez alors le delta de hauteur de cette nouvelle vue en la même quantité négative que la hauteur de votre vue (pour la faire disparaître sous iOS 6).
L'inconvénient de cette alternative (bien que peut-être négligeable compte tenu de la compatibilité avec la rotation automatique) est le fait que cette vue supplémentaire n'est pas immédiatement visible si vous visualisez votre Storyboard pour iOS 6. Vous ne sauriez qu'elle est là si vous jetez un œil au " Document Outline "du Storyboard.
la source
Si vous ne voulez pas que vos contrôleurs de vue soient chevauchés par la barre d'état (et les barres de navigation), décochez la case "Étendre les bords sous les barres supérieures" dans Interface Builder dans Xcode 5.
la source
Apple a publié Q & A technique QA1797: Empêcher la barre d'état de couvrir vos vues . Cela fonctionne bien pour les versions iOS 6 et iOS 7.
la source
J'ai vu de nombreux tutoriels pour résoudre ce problème. Mais aucun d'entre eux ne fonctionne! Voici ma solution, et cela fonctionne pour moi:
La logique est simple. Je décale toutes les vues des enfants sur le self.view avec 20 pixels. C'est tout. Ensuite, la capture d'écran s'affichera comme sur iOS 6. Je déteste la barre d'état iOS7! ~ "~
la source
Une petite alternative à la réponse d'Archy Holt, un peu plus simple:
une. Mettre
UIViewControllerBasedStatusBarAppearance
àNO
en info.plistb. Dans
AppDelegate
l »application:didFinishLaunchingWithOptions:
, composez le :Et ajoutez la méthode:
Vous pouvez également envisager de sous-classer
UIWindow
pour gérerUIApplicationDidChangeStatusBarOrientationNotification
lui-même.la source
Je l'ai utilisé dans tous mes contrôleurs de vue, c'est simple. Ajoutez ces lignes dans toutes vos méthodes viewDidLoad:
la source
Essayez cette méthode simple ....
Étape 1 : Pour changer en single
viewController
Étape 2 : Pour changer dans toute l'application
Étape 3 : ajoutez également ceci dans chacun
viewWillAppear
pour ajuster lastatusbar
hauteuriOS7
la source
Il existe une option dans Interface Builder qui appelle la propriété Delta iOS 6/7 qui vise à résoudre le problème de décalage.
Jetez-y un œil dans Stack Overflow question Interface Builder: À quoi servent les deltas de mise en page UIView iOS 6/7? .
la source
J'ai atteint la barre d'état comme iOS 6 dans iOS 7.
Définissez UIViewControllerBasedStatusBarAppearance sur NO dans info.plist
Placez ce code dans la
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
méthodeIl peut pousser toutes vos vues de 20 pixels vers le haut. Pour venir, utilisez le code suivant dans la
-(void)viewDidAppear:(BOOL)animated
méthodeVous devez définir la valeur windowHeight Userdefaults après l'allocation de fenêtre dans la méthode didFinishLauncing comme
la source
height
égale à 64 au lieu de 44. Ensuite, votre barre s'étendra jusqu'au sommet comme dans les applications d'Apple.Si vous utilisez le générateur d'interface, essayez ceci:
Dans votre fichier xib:
1) Sélectionnez la vue principale, définissez la couleur d'arrière-plan sur noir (ou sur la couleur souhaitée pour la barre d'état)
2) Assurez-vous que l'arrière-plan est une sous-vue autonome positionnée comme un enfant de niveau supérieur de la vue du contrôleur.
Déplacez votre arrière-plan pour devenir un enfant direct de la vue du contrôleur. Vérifiez le panneau de redimensionnement automatique pour vous assurer que vous avez verrouillé tous les bords du cadre, activé les deux axes de flexibilité et s'il s'agit d'un UIImageView, définissez le mode de contenu sur Echelle à remplir. Par programme, cela se traduit par contentMode défini sur UIViewContentModeScaleToFill et a son masque de redimensionnement automatique défini sur (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).
3) Déplacez maintenant tout ce qui est verrouillé vers le haut - de 20 points vers le bas et définissez un delta Y iOS 6/7 sur -20.
Tous les enfants de niveau supérieur qui sont verrouillés sur le cadre supérieur dans le panneau de redimensionnement automatique doivent être abaissés de 20 pts et leur delta Y iOS 6/7 défini sur -20. (Cmd sélectionnez tous ceux-ci et cliquez 20 fois sur la flèche vers le bas - y a-t-il une meilleure façon pour quiconque?)
4) Ajustez la hauteur delta iOS 6/7 de tous les éléments ci-dessus qui avaient une hauteur flexible. Tous les éléments verrouillés en haut et en bas du cadre et dont la hauteur flexible était activée dans le panneau de redimensionnement automatique doivent également avoir leur hauteur delta iOS 6/7 réglée à 20. Cela inclut la vue d'arrière-plan mentionnée ci-dessus. Cela peut sembler anti-intuitif, mais en raison de l'ordre dans lequel ceux-ci sont appliqués, c'est nécessaire. La hauteur du cadre est définie en premier (en fonction de l'appareil), puis les deltas sont appliqués, et enfin les masques de redimensionnement automatique sont appliqués en fonction des positions de décalage de tous les cadres enfants - réfléchissez-y un peu, cela aura du sens.
5) Enfin, les éléments qui étaient verrouillés sur le cadre inférieur mais pas sur le cadre supérieur ne nécessitent aucun deltas.
Cela vous donnera la barre d'état identique dans iOS7 et iOS6.
D'un autre côté, si vous souhaitez un style iOS7 tout en conservant la compatibilité iOS6, définissez les valeurs delta Y / delta height sur 0 pour la vue d'arrière-plan.
Pour voir plus d'informations sur la migration iOS7, lisez l'article complet: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html
la source
Ma solution consistait à ajouter une
UIView
hauteur de 20 points en haut de la fenêtre sur iOS 7. J'ai ensuite créé une méthode dans ma classe AppDelegate pour afficher / masquer l'arrière-plan de la barre d'état "solide". Dansapplication:didFinishLaunchingWithOptions:
:Ensuite, j'ai créé une méthode pour faire apparaître / masquer l'arrière-plan de la barre d'état noire:
Tout ce que je dois faire maintenant, c'est appeler
[appDelegate showSolidStatusBar:YES]
quand c'est nécessaire.la source
Cela peut être un problème majeur si vous utilisez la disposition automatique, car vous ne pouvez plus manipuler directement les cadres. Il existe une solution simple sans trop de travail.
J'ai fini par écrire une méthode utilitaire dans une classe utilitaire et je l'ai appelée à partir de la
viewDidLayoutSubviews
méthode de tous les contrôleurs de vue .Remplacez votre
viewDidLayoutSubviews
méthode dans le contrôleur de vue, où vous voulez la barre d'état. Il vous permettra de surmonter le fardeau de la mise en page automatique.la source
La façon la plus simple de le faire est d'installer un SDK plus ancien sur votre nouveau Xcode.
Comment installer un SDK plus ancien sur le dernier Xcode?
Vous pouvez obtenir le SDK iOS 6.1 sur http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html ou télécharger un ancien Xcode et obtenir le SDK de son contenu
Décompressez et collez ce dossier dans /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Redémarrez le xcode.
J'espère que cela vous aide. Cela a fonctionné pour moi =)
la source
En utilisant
presentViewController:animated:completion:
foiré lewindow.rootViewController.view
, j'ai dû trouver une approche différente à ce problème. Je l'ai finalement fait fonctionner avec des modaux et des rotations en sous-classant l'UIView de mon rootViewController..h
.m
Vous avez maintenant une solution de contournement solide pour les animations iOS7.
la source
Je suis en retard pour cette réponse, mais je veux juste partager ce que j'ai fait, ce qui est fondamentalement la solution la plus simple
Tout d'abord-> Accédez à votre
info.plist
fichier et ajoutez un style de barre d'état-> Style noir transparent (alpha de 0,5)Maintenant, ça y va: -
Ajoutez ce code dans votre AppDelegate.m
la source
Ma solution très simple (en supposant que seule l'orientation verticale est prise en charge) consiste à redéfinir les limites de la fenêtre d'application pour les versions iOS inférieures à 7, dans la méthode déléguée de l'application didFinishLaunchingWithOptions:
la source
Vous pouvez masquer la barre d'état tous ensemble. Votre application sera donc en plein écran. Je pense que c'est le meilleur que vous obtiendrez.
UIStatusBarStyleNone
ou défini dans les paramètres cibles.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
Afin de continuer à travailler avec setStatusBarHidden: J'utilise cette catégorie:
la source
J'ai trouvé ici les meilleures alternatives et solutions pour ce problème de barre de navigation dans iOS7 !!
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
J'espère que cela effacera toutes nos requêtes et inquiétudes.
la source
Cela peut être trop tard pour être partagé, mais j'ai quelque chose à apporter qui pourrait aider quelqu'un, j'essayais de sous-classer l'UINavigationBar et je voulais le faire ressembler à ios 6 avec une barre d'état noire et un texte de barre d'état en blanc.
Voici ce que j'ai trouvé en travaillant pour ça
Cela a rendu mon arrière-plan de barre d'état noir, le texte de la barre d'état blanc et la couleur de la barre de navigation blanche.
iOS 9.3, XCode 7.3.1
la source