Dans iOS 7, la UIStatusBar
a été conçue de manière à se confondre avec la vue suivante:
(Interface graphique conçue par Tina Tavčar )
C'est cool, mais cela gênera quelque peu votre vue lorsque vous avez quelque chose en haut, et cela se superpose à la barre d'état.
Existe-t-il une solution simple (définir une propriété dans info.plist, par exemple) pour en modifier le fonctionnement (sans chevauchement) et revenir à sa configuration dans iOS6?
Je sais qu'une solution plus simple consiste à avoir self.view.center.x
+ 20 points pour chaque contrôleur de vue, mais les modifier entraînera le vissage d'autres dimensions (avoir un self.view.center.x
différent peut causer des problèmes aux séquences personnalisées, etc.) et tout à coup cela devient un travail fastidieux. c'est mieux à éviter.
Je serai vraiment heureux si quelqu'un peut me fournir une solution one-liner pour cela.
P.S. Je sais que je peux cacher la barre d'état en faisant des choses comme avoir
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
Dans la méthode didFinishLaunchingWithOptions
, mais c'est une solution de contournement, un raccourci évitant le problème, donc je ne considère pas cela comme une vraie solution.
Ceci est posté sur un article de blog que j'ai écrit , mais voici le récapitulatif complet des barres d'état, des barres de navigation et des contrôleurs de vue des conteneurs 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 son agencement. L’apparence (légère ou par défaut) n’a aucune incidence sur 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 arrière-plan clair. UIStatusBarStyleDefault est un texte noir sur un arrière-plan clair.
L'apparence de la barre d'état est contrôlée selon l'un des deux chemins de base mutuellement exclusifs: vous pouvez les définir par programme de manière traditionnelle, ou UIKit mettra à jour l'apparence pour vous en fonction de certaines nouvelles propriétés d'UIViewController. La 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 laquelle 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 le paramètre preferredStatusBarStyle, en renvoyant le style par défaut ou clair. Si vous modifiez la valeur de la liste d'adresses en NON, vous pouvez gérer l'apparence de la barre d'état à l'aide des méthodes UIApplication.
UINavigationController modifiera la hauteur de son UINavigationBar en 44 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 la vue est visuellement contigu au sommet de son UIWindow, il dessine sa barre de navigation sur une hauteur de 64 points. Si le sommet de sa vue n’est pas contigu au sommet de UIWindow (même s’il n’est décalé que d’un point), la barre de navigation s’affiche de manière «traditionnelle» avec une hauteur de 44 points. Cette logique est effectuée par UINavigationController même s'il s'agit de plusieurs enfants situés dans la hiérarchie du contrôleur de vue de votre application. Il n'y a aucun moyen d'empêcher ce comportement.
Si vous fournissez une image d'arrière-plan de barre de navigation personnalisée ne dépassant pas 44 points (88 pixels) et que les limites de la vue de UINavigationController correspondent aux limites de UIWindow (comme expliqué au point 4), UINavigationController trace votre image dans le cadre (0,20,320 , 44), en laissant 20 points d’espace noir opaque au-dessus de votre image personnalisée. Cela peut vous induire en erreur en pensant que vous êtes un développeur intelligent qui a contourné la règle n ° 1, mais vous vous trompez. La barre de navigation fait toujours 64 points. L'incorporation d'un UINavigationController dans une hiérarchie de vues de style avec diapositives vous permet de le comprendre très clairement.
Méfiez-vous de la propriété edgeForExtendedLayout nommée de manière déroutante d'UIViewController. Le réglage de edgeForExtendedLayout ne fait rien dans la plupart des cas. Si UIKit utilise cette propriété uniquement si vous ajoutez un contrôleur de vue à un UINavigationController, UINavigationController utilise edgeForExtendedLayout pour déterminer si son contrôleur de vue enfant doit être visible ou non sous la zone de barre de navigation/barre d'état. La définition de edgeForExtendedLayout sur le UINavigationController lui-même ne modifie pas le fait que UINavigationController ait ou non une zone de barre de navigation de 44 ou 64 points. Voir n ° 4 pour cette logique. Une logique de présentation similaire s'applique au bas de votre vue lorsque vous utilisez une barre d'outils ou UITabBarController.
Si vous essayez uniquement d'empêcher votre contrôleur de vue enfant personnalisé de recouvrir la barre de navigation lorsque vous vous trouvez dans un contrôleur UINavigationController, définissez edgeForExtendedLayout sur UIRectEdgeNone (ou au moins un masque excluant 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 compiler les contentInsets des vues de table et des vues de collection dans sa hiérarchie de sous-vues. Cela se fait d’une manière similaire à la logique de la barre d’état à partir de # 4. Il existe un moyen programmé d'empêcher cela, en définissant automatiquementAdjustsScrollViewInsets sur NO pour vos vues de table et de collection (la valeur par défaut est YES). Cela posait de sérieux problèmes pour Whisper et Riposte, car nous utilisons des ajustements contentInset pour contrôler la disposition des vues de tableau en réponse aux mouvements de la barre d’outils et du clavier.
Pour rappel, il n’ya aucun moyen de revenir à la logique d’agencement de la barre d’état de style iOS 6. Pour vous en approcher, vous devez déplacer tous les contrôleurs de vue de votre application dans une vue de conteneur décalée de 20 points par rapport au haut de l'écran, en laissant une vue volontairement noire derrière la barre d'état pour simuler l'aspect ancien. C'est la méthode que nous avons utilisée dans Riposte et Whisper.Apple s’efforce de faire en sorte que vous n’essayiez pas de faire la 9e place. Ils veulent que nous repensions toutes nos applications pour que la barre d'état soit sous-jacente. Il existe de nombreux arguments convaincants, cependant, pour l'expérience utilisateur et pour des raisons techniques, ce n'est pas toujours une bonne idée. Vous devez faire ce qu'il y a de mieux pour vos utilisateurs et ne pas simplement suivre les caprices de la plate-forme.
Apple is pushing very hard to ensure that you don’t try to do #9. They want us to redesign all our apps to underlap the status bar. There are many cogent arguments, however, for both user experience and technical reasons, why this is not always a good idea. You should do what is best for your users and not simply follow the whimsy of the platform.
Mises à jour le 19 septembre 2013:
correction de bugs de mise à l'échelle en ajoutant
self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
fautes de frappe corrigées dans l'instruction
NSNotificationCenter
Mises à jour le 12 septembre 2013:
corrigé
UIViewControllerBasedStatusBarAppearance
àNO
ajout d'une solution pour les applications avec rotation d'écran
ajouté une approche pour changer la couleur de fond de la barre d'état.
Il n'y a apparemment aucun moyen de rétablir la barre d'état d'iOS7 dans son fonctionnement sous iOS6.
Cependant, nous pouvons toujours écrire des codes et transformer la barre d'état en iOS6, et voici le moyen le plus rapide que je puisse trouver:
Définissez UIViewControllerBasedStatusBarAppearance
sur NO
dans info.plist
(pour ne pas utiliser de contrôleurs de vue, ajustez 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 application:didFinishLaunchingWithOptions
d'AppDelegate, appelez
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds =YES;
self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
//Added on 19th Sep 2013
self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
}
return YES;
afin de:
Vérifiez si c'est iOS 7.
Définissez le contenu de la barre d'état sur blanc, par opposition à UIStatusBarStyleDefault.
Évitez d'afficher les sous-vues dont les cadres dépassent les limites visibles (pour les vues s'animant depuis le haut dans la vue principale).
Créez l'illusion que la barre d'état occupe de la place, comme dans iOS 6, en décalant et en redimensionnant le cadre de la fenêtre de l'application.
utilisez NSNotificationCenter pour détecter les changements d’orientation en ajoutant
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
dans if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
et créez une nouvelle méthode dans AppDelegate:
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
int w = [[UIScreen mainScreen] bounds].size.width;
int h = [[UIScreen mainScreen] bounds].size.height;
switch(a){
case 4:
self.window.frame = CGRectMake(0,20,w,h);
break;
case 3:
self.window.frame = CGRectMake(-20,0,w-20,h+20);
break;
case 2:
self.window.frame = CGRectMake(0,-20,w,h);
break;
case 1:
self.window.frame = CGRectMake(20,0,w-20,h+20);
}
}
Ainsi, lorsque l'orientation change, une instruction switch détecte l'orientation de l'écran de l'application (Portrait, À l'envers, Paysage à gauche ou Paysage à droite) et modifie le cadre de la fenêtre de l'application pour créer l'illusion de la barre d'état iOS 6.
Ajouter
@property (retain, nonatomic) UIWindow *background;
dans AppDelegate.h
faire de background
une propriété de votre classe et empêcher ARC de le désallouer. (Vous n'êtes pas obligé de le faire si vous n'utilisez pas ARC.)
Après cela, il vous suffit de créer la UIWindow dans if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
:
background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];
N'oubliez pas de @synthesize background;
après @implementation AppDelegate
!
UPDATE (NOUVELLE SOLUTION)
Cette mise à jour constitue la meilleure solution au problème de la barre de navigation iOS 7. Vous pouvez définir un exemple de couleur de la barre de navigation: FakeNavBar.backgroundColor = [UIColor redColor];
Remarque: Si vous utilisez le contrôleur de navigation par défaut, veuillez utiliser une ancienne solution.
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
{
UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
FakeNavBar.backgroundColor = [UIColor whiteColor];
float navBarHeight = 20.0;
for (UIView *subView in self.window.subviews) {
if ([subView isKindOfClass:[UIScrollView class]]) {
subView.frame = CGRectMake(subView.frame.Origin.x, subView.frame.Origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
} else {
subView.frame = CGRectMake(subView.frame.Origin.x, subView.frame.Origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
}
}
[self.window addSubview:FakeNavBar];
}
return YES;
}
OLD SOLUTION - SI vous utilisez le code précédent, ignorez le code et l'image suivants
Ceci est l'ancienne version de la solution de barre de navigation iOS 7.
J'ai résolu le problème avec le code suivant. C'est pour ajouter une barre d'état . DidFinishLaunchingWithOptions
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
UIView *addStatusBar = [[UIView alloc] init];
addStatusBar.frame = CGRectMake(0, 0, 320, 20);
addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
[self.window.rootViewController.view addSubview:addStatusBar];
}
Et pour Interface Builder c'est pour quand vous ouvrez avec iOS 6; il commence à 0 pixel.
SOLUTION :
Définissez-le dans votre contrôleur de vue ou dans rootviewcontroller en remplaçant la méthode:
-(BOOL) prefersStatusBarHidden
{
return YES;
}
Voici une autre approche pour les projets qui utilisent beaucoup le Storyboard:
OBJECTIF:
L'objectif 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écalant les éléments de l'interface superposés par la barre d'état (sous iOS 7) vers le bas, tout en utilisant des deltas pour inverser le changement de disposition vers le bas pour iOS 6.1 ou une version antérieure. L'espace supplémentaire résultant dans iOS 7 est alors occupé par un UIView avec le paramètre 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, supposons que View controller-based status bar appearance
est défini sur NO et que votre Status bar style
est défini sur "Style de noir transparent (alpha de 0,5)" ou "Style de 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 UI pour qu'elle serve d'arrière-plan dans la barre d'état. Pour ce faire, ajoutez les éléments suivants au application: didFinishLaunchingWithOptions:
après makeKeyAndVisible
de votre AppDelegate
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
statusBarBackgroundView.backgroundColor = [UIColor blackColor];
[yourAppsUIWindow addSubview:statusBarBackgroundView];
}
Étant donné que vous avez ajouté un arrière-plan pour iOS 7 par programme, vous devrez ajuster la disposition de vos éléments d'interface utilisateur qui sont superposés par la barre d'état en conséquence, tout en conservant leur disposition pour iOS6. Pour ce faire, procédez comme suit:
Use Autolayout
n'est pas coché pour votre Storyboard (sinon, "Deltas iOS 6/7" n'apparaît pas dans l'inspecteur de taille). Pour faire ça:ALTERNATIVES:
Pour ajouter encore moins de code dans les projets de storyboard lourds et pour autoriser la rotation de la barre d'état en arrière-plan, 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 situé tout en haut de la vue principale de ce contrôleur. Vous pouvez alors modifier le delta de hauteur de cette nouvelle vue sur le même montant négatif 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é de l’autorotation) est le fait que cette vue supplémentaire n’est pas immédiatement visible si vous visualisez votre Storyboard pour iOS 6. Vous ne saurez qu’elle est présente si vous regardez " Document Outline "du Storyboard.
Si vous ne souhaitez pas que vos contrôleurs de vue soient superposé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 in Xcode 5.
Apple a publié Questions techniques (QA1797): Empêcher la barre d'état de couvrir vos vues Cela fonctionne très bien pour les versions iOS 6 et iOS 7.
J'ai consulté de nombreux tutoriels pour résoudre ce problème. Mais aucun d'entre eux ne fonctionne! Voici ma solution, et cela fonctionne pour moi:
if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
for( UIView *v in [self.view subviews] ) {
CGRect rect = v.frame;
rect.Origin.y += statusBarHeight;
v.frame = rect;
}
}
La logique est simple. Je décale toutes les vues des enfants sur l'auto-vision de 20 pixels . Ensuite, la capture d'écran s'affichera exactement comme iOS 6. Je déteste la barre d'état iOS7! ~ "~
Une petite alternative à la réponse de Archy Holt, un peu plus simple:
une. Définissez UIViewControllerBasedStatusBarAppearance
sur NO
dans info.plist
b. Dans AppDelegate
's application:didFinishLaunchingWithOptions:
, appelez:
if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
// handling statusBar (iOS7)
application.statusBarStyle = UIStatusBarStyleLightContent;
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.window.clipsToBounds = YES;
// handling screen rotations for statusBar (iOS7)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}
Et ajoutez la méthode:
- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
// handling statusBar (iOS7)
self.window.frame = [UIScreen mainScreen].applicationFrame;
}
Vous pouvez également envisager de sous-classer UIWindow
pour traiter UIApplicationDidChangeStatusBarOrientationNotification
lui-même.
Je l'ai utilisé dans tous mes contrôleurs de vue, c'est simple . Ajoutez ces lignes dans toutes vos méthodes viewDidLoad:
- (void)viewDidLoad{
//add this 2 lines:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
[super viewDidLoad];
}
Essayez cette méthode simple ....
Étape 1 : Pour changer en un seul viewController
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];
Etape 2 : Changer en application entière
info.plist
----> Status Bar Style
--->UIStatusBarStyle to UIStatusBarStyleBlackOpaque
Étape 3 : Ajoutez également ceci dans chaque viewWillAppear
pour ajuster statusbar
height pour iOS7
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
CGRect frame = [UIScreen mainScreen].bounds;
frame.Origin.y+=20.0;
frame.size.height-= 20.0;
self.view.frame = frame;
[self.view layoutIfNeeded];
}
J'ai atteint la barre d'état comme iOS 6 dans iOS 7.
Définissez UIViewControllerBasedStatusBarAppearance sur NO dans info.plist
Insérer ce code dans la méthode - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds =YES;
self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height);
//Added on 19th Sep 2013
NSLog(@"%f",self.window.frame.size.height);
self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}
Il peut repousser toutes vos vues de 20 pixels. Pour éviter cela, utilisez le code suivant dans la méthode -(void)viewDidAppear:(BOOL)animated
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGRect frame=self.view.frame;
if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
{
frame.size.height-=20;
}
self.view.frame=frame;
}
Vous devez définir la valeur windowHeight Userdefaults après l’affectation de la fenêtre dans la méthode didFinishLauncing, comme
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
Il existe une option dans Interface Builder qui appelle la propriété iOS 6/7 Delta qui vise à résoudre le problème de décalage.
Jetez-y un coup d'oeil dans la question sur le débordement de la pile Interface Builder: A quoi servent les deltas pour iOS 6/7 de UIView.
Si vous utilisez Interface Builder, essayez ceci:
Dans votre fichier xib:
1) Sélectionnez la vue principale, définissez la couleur d'arrière-plan sur noir (ou la couleur de votre choix pour que la barre d'état soit
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 Échelle à remplir. Par programme, cela se traduit par contentMode défini sur UIViewContentModeScaleToFill et son masque de redimensionnement automatique défini sur (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).
3) Maintenant, déplacez de 20 pts tout ce qui est verrouillé en haut et en bas et réglez un delta Y iOS 6/7 sur -20.
Tous les enfants de niveau supérieur qui sont verrouillés dans le cadre supérieur du panneau de redimensionnement automatique doivent être déplacés de 20 points vers le bas et leur iOS 6/7 delta Y doit être défini sur -20. (Cmd sélectionnez tous ceux-ci et cliquez 20 fois sur la flèche - est-ce qu'il y a une meilleure façon, n'importe qui?)
4) Ajustez la hauteur delta iOS 6/7 de tous les éléments ci-dessus ayant une hauteur flexible. Tous les éléments verrouillés aux cadres supérieur et inférieur et pour lesquels la hauteur flexible est activée dans le panneau de redimensionnement automatique doivent également avoir leur hauteur delta iOS 6/7 définie sur 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 elles sont appliquées, cela est nécessaire. La hauteur du cadre est définie en premier (en fonction du périphérique), 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 instant, cela aura du sens.
5) Enfin, les éléments qui étaient verrouillés dans le cadre inférieur mais pas dans le cadre supérieur n'ont pas besoin de deltas.
Cela vous donnera la barre d'état identique dans iOS7 et iOS6.
Par contre, si vous voulez le style iOS7 tout en maintenant la compatibilité iOS6, définissez les valeurs delta Y/hauteur delta sur 0 pour la vue en 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
Cela peut poser un problème énorme 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 méthode viewDidLayoutSubviews
de tous les contrôleurs de vue.
+ (void)addStatusBarIfiOS7:(UIViewController *)vc
{
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
CGRect viewFrame = vc.view.frame;
if(viewFrame.Origin.y == 20) {
//If the view's y Origin is already 20 then don't move it down.
return;
}
viewFrame.Origin.y+=20.0;
viewFrame.size.height-= 20.0;
vc.view.frame = viewFrame;
[vc.view layoutIfNeeded];
}
}
Remplacez votre méthode viewDidLayoutSubviews
dans le contrôleur de vue, là où vous voulez la barre d'état. Cela vous permettra de supporter le fardeau d’Autolayout.
- (void)viewDidLayoutSubviews
{
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
[super viewDidLayoutSubviews];
[MyUtilityClass addStatusBarIfiOS7:self];
}
Ma solution a été d'ajouter un UIView
avec une hauteur de 20 points en haut de la fenêtre lorsque vous êtes sur iOS 7. Ensuite, j'ai créé une méthode dans ma classe AppDelegate pour afficher/masquer l'arrière-plan "plein" de la barre d'état. Dans application:didFinishLaunchingWithOptions:
:
// ...
// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];
// ...
return YES;
Ensuite, j'ai créé une méthode pour ouvrir/fermer en fondu l'arrière-plan de la barre d'état noire:
- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
[UIView animateWithDuration:0.3f animations:^{
if(solidStatusBar)
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
self.statusBarBackground.alpha = 1.0f;
}
else
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
self.statusBarBackground.alpha = 0.0f;
}
}];
}
Il ne me reste plus qu'à appeler: [appDelegate showSolidStatusBar:YES]
si nécessaire.
Le moyen le plus simple consiste à installer un SDK plus ancien sur votre dernier Xcode.
Comment installer un SDK plus ancien sur le dernier Xcode?
Vous pouvez obtenir le SDK iOS 6.1 à partir de http://www.4shared.com/Zip/NlPgsxz6/iPhoneOS61sdk.html ou télécharger un ancien Xcode et extraire 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 ça vous aide. Cela a fonctionné pour moi =)
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-> Allez dans votre info.plist
Fichier et ajoutez un style de barre d'état-> Style noir transparent (Alpha de 0.5)
Maintenant, voilà: -
Ajoutez ce code dans votre AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Whatever your code goes here
if(kDeviceiPad){
//adding status bar for IOS7 ipad
if (IS_IOS7) {
UIView *addStatusBar = [[UIView alloc] init];
addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
[self.window.rootViewController.view addSubview:addStatusBar];
}
}
else{
//adding status bar for IOS7 iphone
if (IS_IOS7) {
UIView *addStatusBar = [[UIView alloc] init];
addStatusBar.frame = CGRectMake(0, 0, 320, 20);
addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
[self.window.rootViewController.view addSubview:addStatusBar];
}
return YES;
}
En utilisant presentViewController:animated:completion:
décoiffé le window.rootViewController.view
, je devais trouver une approche différente de ce problème. Je l’ai enfin fait fonctionner avec des modaux et des rotations en sous-classant l’UIView de mon rootViewController.
.h
@interface RootView : UIView
@end
.m
@implementation RootView
-(void)setFrame:(CGRect)frame
{
if (self.superview && self.superview != self.window)
{
frame = self.superview.bounds;
frame.Origin.y += 20.f;
frame.size.height -= 20.f;
}
else
{
frame = [UIScreen mainScreen].applicationFrame;
}
[super setFrame:frame];
}
- (void)layoutSubviews
{
self.frame = self.frame;
[super layoutSubviews];
}
@end
Vous avez maintenant une solution de contournement forte pour les animations iOS7.
C’est peut-être trop tard pour le partager, mais j’ai une contribution à apporter qui pourrait aider quelqu'un. J'essayais de sous-classer le UINavigationBar et je voulais le faire ressembler à ios 6 avec une barre d'état noire et son texte en blanc.
Voici ce que j'ai trouvé en travaillant pour ça
self.navigationController?.navigationBar.clipsToBounds = true
self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()
L'arrière-plan de la barre d'état était noir, le texte de la barre d'état était blanc et la couleur de la barre de navigation blanche.
iOS 9.3, XCode 7.3.1
Pour continuer à travailler avec setStatusBarHidden: J'utilise cette catégorie:
@interface UIApplication (StatusBar)
-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;
@end
@implementation UIApplication (StatusBar)
-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
if (!IOS7) {
[self setStatusBarHidden:statusBarHidden];
return;
}
if ([self isStatusBarHidden] == statusBarHidden) {
return;
}
[self setStatusBarHidden:statusBarHidden];
[self keyWindow].clipsToBounds = YES;
CGFloat offset = statusBarHidden ? 0 : 20;
[self keyWindow].frame = CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
[self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}
@end
Ma solution très simple (en supposant que seule l'orientation verticale soit prise en charge) consiste à redéfinir les limites de la fenêtre de l'application pour les versions d'iOS inférieures à 7, dans la méthode didFinishLaunchingWithOptions du délégué de l'application:
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
// handling statusBar (iOS6) by leaving top 20px for statusbar.
screenBounds.Origin.y = 20;
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
Vous pouvez masquer la barre d'état tous ensemble. Donc, votre application sera en plein écran. Je pense que c'est le meilleur que vous obtiendrez.
UIStatusBarStyleNone
ou défini dans les paramètres de la cible.
Steps For Masquer la barre d'état dans iOS 7:
1.Accédez au fichier info.plist de votre application.
2.And Set, Voir l'apparence de la barre d'état basée sur le contrôleur: Boolean NO
J'espère que j'ai résolu le problème de la barre d'état .....
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 questions et nos soucis.